これら2つのインデックスの違いは何ですか?「PRIMARY」の下にある両方の列とその逆の違いについて言及しています。
2 に答える
1つ目は、組み合わせuser_id, wallet_type
が一意であることを意味し、2つ目は一意としてのみ定義さvisitid
れます。
最初のものは、複数列、複合、または複合キーとして知られています。この場合、主キー制約は、リストされた順序 (user_id、次に wallet_type) での 2 つの列の組み合わせです。結合された 2 つの列は、行ごとに一意である必要があります。
したがって、次のデータは問題ありません。
user_id(pk) wallet_type(pk)
-------------------------
1 1
1 2
2 2
行は重複する user_id または wallet_type を持つことができますが、両方はできないことに注意してください。
user_id(pk) wallet_type(pk)
-------------------------
1 1
1 2
2 2
1 1 // Duplicate key
2 番目の例は、通常の 1 列のキーであり、visitid 列の値のみが一意である必要があります。
visitid(pk) session
-------------------------
1 1
1 2 // Duplicate key
これには多くの意味があります。
複数列の主キーはより大きいため、より多くのストレージを使用し、MySQL のトラバースがわずかに遅くなります。
また、InnoDB では、主キーがクラスター化されたインデックスであるため、挿入は悪影響を受けます。つまり、物理的な順序で格納されます。インデックスが大きいほど、更新に時間がかかります。ただし、最後に行を追加しても問題ありません。
複数列インデックスをカバリングインデックスとして使用できるなど、いくつかの利点があります。
たとえば、次のクエリは、複数列の主キーを使用して最適化されます。
SELECT user_id, wallet_type FROM table1 WHERE user_id = 1
SELECT user_id, wallet_type FROM table1 WHERE user_id = 1 AND wallet_type = 2
SELECT user_id, wallet_type FROM table1 ORDER BY user_id, wallet_type
SELECT user_id, wallet_type FROM table1 WHERE user_id = 1 ORDER BY wallet_type
SELECT user_id, wallet_type FROM table1 WHERE user_id > 1 AND wallet_type > 2
SELECT user_id, wallet_type FROM table1 ORDER BY user_id, wallet_type
ただし、列にはプレフィックスが付けられたままになっているため、このクエリは最適化されません。
SELECT user_id, wallet_type FROM table1 WHERE wallet_type = 2
これは、user_id が WHERE 句で参照されていないが、user_id がキーの最初の列であるためです。列をスキップすることはできません。