ホームページ >データベース >mysql チュートリアル >MySQL で自動インクリメント ID の主キーと UUID を主キーとして使用する利点と欠点を比較する詳細なプロセス (100 万から 1,000 万のテーブル レコードのテスト)
テストの理由
開発同僚が、主キーが uuid であるフレームワークを作成しました。私は、mysql は uuid を使用せず、自動インクリメント主キーを使用するべきだと彼に提案しました。自動インクリメントの主キーはより効率的であると彼は言いましたが、それは必ずしも高いわけではなく、実際に彼を説得するために、innodb のインデックス作成の特性により、自動インクリメント ID が最も効率的に使用されることになります。場合によっては、詳細なテストを行う準備をしました。
インターネット企業としてはユーザーテーブルが必ず存在し、ユーザーテーブル UC_USER には基本的に数百万のレコードがあるため、このテーブルに基づいて準テストデータを使用してテストします。
テストプロセスは、私が現在考えている一般的に使用されているさまざまな種類の SQL に基づいています。もちろん、完璧ではないかもしれません。より完全なテスト計画を提案するためにメッセージを残してください。または SQL ステートメントをテストします。
UC_USER を準備します。テーブル構造は次のようになります。
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; +----------+ | count(1) | +--- --------+ | 5720112 | +----------+ 1 行 (1.91 秒) |
占有スペース 自己増加IDはUUIDの半分程度小さいようです。
主キーの種類 |
データファイルサイズ |
占有容量 |
ID |
-rw-rw---- 1 mysql mysql 2.5G 8 月 11 日 18:29 UC_USER.ibd |
2.5 G |
UUID |
-rw-rw---- 1 mysql mysql 5.4G 8 月 15 15:1 1 UC_USER_PK_VARCHAR_1 .ibd |
5.4 G |
主キーの種類 |
SQL文 |
実行時間(秒) |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
自動インクリメントID | SELECT SQL_NO_CACHE t.* FROM test.` UC_USER` t WHERE t .`MOBILE` ='14782121512'; |
0.118 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
UUID |
SELECT SQL_NO_CACHE t.* FROM test.`UC_USER_PK_VARCHAR_1` t WHERE t.`MOBILE` ='14782121512'; |
0.117 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
自己増分ID |
SELECT SQL_NO_CACHE t.* FROM test.`UC_USER` t WHERE t.`MOBILE` IN( '14782121512','13761460105'); |
0.049 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| SELECT SQL_NO_ CACHE t. * FROM test.`UC_USER_PK_VARCHAR_1` t WHERE t.`MOBILE` IN('14782121512','13761460105');0.040 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
SELECT SQL_NO_CACHE t.* FROM test.`UC_USER` t WHERE t.`CREATE_DATE`='2013-11-24 10:26:36' ; | 0.139 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
SELECT SQL_NO_CACHE t.* FROM test.`UC_USER_PK_VARCHAR_1` t WHERE t.`CREATE_DATE`='2013-11-24 10:26:43' ; | 0.126 |
|
主キーの種類 |
SQL文 |
実行時間(秒) |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
(1)ファジー範囲クエリ1000個のデータ、自動インクリメントIDのパフォーマンスはUUIDよりも優れています | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
オート-increment ID |
SELECT SQL_NO_CACHE t.* FROM test.`UC_USER` t WHERE t.`MOBILE` LIKE '147%' LIMIT 1000; |
1.784 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
UUID |
選択SQL _NO_CACHE t.* FROM test. `UC_USER_PK_VARCHAR_1` t WHERE t.`MOBILE` LIKE '147%' LIMIT 1000; |
3.196 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
(2) 日付範囲クエリ 2 0データ、自動インクリメント ID は UUID よりわずかに弱いです | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
自動インクリメント ID |
SELECT SQL_NO_CACHE t.* FROM test.`UC_USER` t WHERE t.`CREATE_DATE` > '2016-08-01 10:26 :36' ORDER BY t.`UPDATE_DATE` DESC LIMIT 20; |
0.601 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
UUID |
SELECT SQL_NO_CACHE t.* FROM test.`UC_USER_PK_VAR_1` t WHERE t.`CREATE_DATE`> ; '2016-08-01 10:26:36' ORDER BY t.`UPDATE_DATE` DESC LIMIT 20; |
0.543 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
(3) 範囲クエリ 200 データ、自動インクリメント ID のパフォーマンスはUUID | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
自己インクリメントID |
SELECT SQL_NO_CACHE t.* FROM test.`UC_USER` t WHERE t.`CREATE_DATE` > '2016-07-01 10:26:36' ORDER BY t.`UPDATE_DATE` DESC LIMIT 200; | 2.314 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
UUID |
SELECT SQL_NO_CACHE t.* FROM test.`UC_USER_PK_VARCHAR_1` t WHERE t.`CREATE_DATE` > '2016-07 -01 10:26:36' ORDER BY t. `UPDATE_DATE` DESC LIMIT 200; |
3.229 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
合計数量の範囲クエリ、自動インクリメント ID は UUID よりも優れています | Auto-IncrementId|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
UUID |
SELECT SQL_NO_CACHE COUNT(1) FROM test.`UC_USER_PK_VARCHAR_1` t WHERE t.`CREATE_DATE` > '2016-07-01 10:26:36' ; |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
PS: キャッシュが存在する場合、この 2 つの実行効率には小さな違いはありません。
2.4 書き込みテスト、自動インクリメント ID は UUID 4 回
2.5 、备份和恢复、自增IDのパフォーマンスはUUID
占有容量の点で、自動インクリメントIDはUUIDの約半分です:
|