Believe you can

If you can dream it, you can do it.

TiDBとMySQLの機能比較

ZOZO Advent Calendar 2022 カレンダー Vol.3 の 9 日目の記事です。

久しぶりのブログ更新になります。前回からだいぶ時間が空いてしまったので定期的に書けるようにしていかないとと反省しています。。

NewDBと呼ばれる新しいデータベースが登場し利用事例が増えてきました。その中でもMySQL互換のTiDBについて耳にする機会が増えたので、MySQLとの機能比較を行ってみました。DB選定や移行検討の際にお役に立てれば幸いです。

TiDBとは

TiDBはPingCAP社が開発した分散型データベースで、RDBMSとNoSQLの機能を組み合わせたデータベースです。
MySQL互換のSQL解析機能を持っているためアプリケーションからはMySQLと同様のアクセスが可能であり、水平方向のスケーラビリティ・協力な一貫性・高可用性を兼ね備えています。

pingcap.co.jp

MySQLとTiDBの比較

アプリケーションから利用する際の機能比較になります。インフラ・運用面、費用などは利用する環境によってパターンが多く出てしまうため、対象外とします。

トランザクション分離レベル

(一つの表にまとめるのが困難だったので別途切り出してます...)

  • ダーティリード:コミットされていないデータを別トランザクションで読めてしまう
  • ノンリピータブルリード:コミットされたデータを別トランザクションが読めてしまう
  • ファントムリード:取得したデータに対して別トランザクションがInsert or Deleteしてコミットすると同じ条件で読み込むとデータが増減している

MySQL8

ダーティリード ノンリピータブルリード ファントムリード
READ UNCOMMITTED
READ COMMITTED
REPEATABLE READ
(デフォルト)
SERAIALAZABLE

TiDB

ダーティリード ノンリピータブルリード ファントムリード
READ UNCOMMITTED
READ COMMITTED
REPEATABLE READ
(デフォルト)
SERAIALAZABLE

その他

項目 MySQL8 TiDB 備考
DDL
  • 複数変更を伴うalter tableは使えない
権限
  • MySQL5.7に準拠
文字コードと順序
  • デフォルト文字コード:utf8mb4
  • デフォルト順序:utf8mb4_0900_ai_ci
  • MySQL5.7に準拠
  • ci:大小文字区別なし
  • cs:大小文字区別あり
  • _bin:バイナリ比較
索引
(index)
  • 実行プランあり
  • ヒント句の利用可能
一時テーブル
(temporary)
  • 利用可能
ビュー
(view)
  • 利用可能
分割
(partition)
  • 利用可能
自動採番
(auto increment)
  • 利用はできるが連番で採番されないので代わりにシーケンスを利用する
外部キー
(foreign key)
  • 定義できるが制約チェックやdelete cascadeは動作しない
ユニーク制約
(unique index)
  • 利用可能
検査制約
(check)
  • MySQL5.7に準拠
    • 制約はつけれるが動作しない

(data type)
  • SPATIALを除くMySQLの型が利用可能(ただし、JSON型は利用できるが実験的機)能
結合
(join)
  • 利用可能
    • サブクエリが遅いことがある
    • TiFlashやParallel Applyで改善するかも
トリガー
(trigger)
  • 利用不可
ストアドプロシージャ、関数
(procedure/function)
  • 利用不可
集計関数
(window function)
  • 利用可能
  • 一部利用可能(参考

まとめ

MySQL5.7をベースにしているだけあってMySQLと同等のことが行えそうです。ただ、

  • 外部キーの動作
  • auto increment

は、データの整合性・値を別途取得するなど、アプリでの対応が必要となり移行の際に改修ゼロとまではいかなそうです。外部キーはプロジェクトのルールで必須となっている場合もあるかと思うので、使えないのは厳しいかもしれませんね。 とは言いつつもここまで互換性があると、書き込み性能に困っているアプリケーションの移行先にTiDBが選ばれるのも分かる気がします。近い将来、機能差異もなくなるのではないかと思うと今後の動向を注目ですね。

次回はアプリケーション(SpringBoot+JPA)からTiDBを利用する記事を書こうと思います。