テストの理由
開発同僚が主キーがuuidであるフレームワークを作成したので、mysqlはuuidを使用せず、自動インクリメントを使用するべきだと彼に提案しました。主キーは効率的ですが、必ずしも高いわけではないと私は言いました。InnoDB のインデックス機能では、主キーとして自動インクリメントを使用するのが最も効率的です。彼を説得するために、私は詳細を準備しました。テスト。
インターネット企業としてはユーザーテーブルが必ず存在し、ユーザーテーブル UC_USER には基本的に数百万のレコードがあるため、このテーブルに基づいて準テストデータを使用してテストします。
おおよその環境はCentos6.5、MySQL5.6.12
UC_USER、クレメント ID 主キー:
CREATE TABLE `UC_USER` ( |
UC_USER_PK_VARCHARテーブル、uuidを使用して文字列IDが主キーになります
CREATE TABLE `UC_USER_PK_VAR_1` ( |
各テーブルのデータ量を2つ確認
# 自動インクリメントされたIDを主キーとするテーブル mysql> select count(1) from UC_USER; +-------- --+ | カウント(1 ) | +----------+ | 5720112 | +----------+ 1 行(0.00 秒)
mysql> ;
# 主キーとして uuid を持つテーブル mysql> select count(1) from UC_USER_PK_VARCHAR_1; --------+ | + ----------+ 1 row in set (1.91 sec)
| 占有スペース 自己増加IDはUUIDの半分くらい小さいようです。
データファイルサイズ |
占有容量 |
ID |
2.5 G | UUID |
|
5.4 G |
|
SQL文 |
実行時間(秒) |
自動インクリメントID | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0.118 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| UUID |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0.117 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
自己増分ID |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0.049 | UUID |
| SELECT SQL_NO_ CACHE t. * FROM test.`UC_USER_PK_VARCHAR_1` t WHERE t.`MOBILE` IN('14782121512','13761460105');||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0.040 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
自己インクリメント ID | SELECT SQL_NO_CACHE t.* FROM test.`UC_USER` t WHERE t.`CREATE_DATE`='2013-11-24 10:26:36' ; | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0.139 |
| UUIDSELECT SQL_NO_CACHE t.* FROM test.`UC_USER_PK_VARCHAR_1` t WHERE t.`CREATE_DATE`='2013-11-24 10:26:43' ; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0.126 |
2.3 スコープlikeクエリ、自動インクリメントIDパフォーマンスはUUID
|