UNIQUE制約は自動的にフィールドにINDEXを作成しますか?


97

私は必要があります別のインデックス定義email(目的を検索するための)列、または「自動」と一緒に添加される指標であるUNIQ_EMAIL_USER制約は?

CREATE TABLE IF NOT EXISTS `customer` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `first` varchar(255) NOT NULL,
  `last` varchar(255) NOT NULL,
  `slug` varchar(255) NOT NULL,
  `email` varchar(255) NOT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `UNIQ_SLUG` (`slug`),
  UNIQUE KEY `UNIQ_EMAIL_USER` (`email`,`user_id`),
  KEY `IDX_USER` (`user_id`)
) ENGINE=InnoDB;

編集:コービンによって提案されたように私EXPLAIN SELECT * FROM customer WHERE email = 'address'は空のテーブルで照会しました。これは結果です、私はそれを解釈する方法がわかりません:

id select_type type possible_keys key  key_len ref  rows Extra
1  SIMPLE      ALL  NULL          NULL NULL    NULL 1    Using where

IXD_EMAILをテーブルに追加するときに、同じクエリが示します。

id select_type type possible_keys key       key_len ref   rows Extra
1  SIMPLE      ref  IDX_EMAIL     IDX_EMAIL 257     const 1    Using where

1
UNIQUE制約は技術的にはインデックスを必要としません...しかし、標準がそれを定義する方法またはMySQL(どのバックエンド、btw?)がそれを実装するかはわかりません。MySQLで手動ですばやく見つけることができるのは、「一意のインデックスは、インデックス内のすべての値が異なる必要があるような制約を作成すること」です。

個々のインデックスとカバリング(AKAコンポジット-複数の列)インデックスを実装してテストする必要があります。使用状況やデータにより異なります。
OMGポニー

3
私は99%確かにそれがインデックスを作成することを確信しています。一意のテーブルを作成し、場所を使用して選択について説明するだけです。
コービン2012年

@Corbinはそれをしました、私は結果をどのように解釈すべきですか?
gremo 2012年

一意制約をインデックスとして使用しましたか?ちなみに、非常に大きなテーブルを使用する必要がある場合や、単にテーブルスキャンを実行する場合があります。
コービン2012年

回答:


115

ユニークキーが追加の一意性をチェックすると、通常のインデックスのような演技、インデックスの特殊なケースです。使用SHOW INDEXES FROM customerすると、一意のキーが実際にはBツリータイプのインデックスであることがわかります。

複合インデックスには(email, user_id)十分です、あなただけの電子メールの別のインデックスを必要としない- MySQLは複合インデックスの左端のパーツを使用することができます。インデックスのサイズによってクエリの速度が低下する可能性があるいくつかの境界ケースがあるかもしれませんが、実際に実行するまで心配する必要はありません。

インデックスの使用のテストに関しては、最初にテーブルにデータを入力して、オプティマイザがそのインデックスを使用する価値があると考えさせる必要があります。


だからEXPLAINテストショーがあるため、空のテーブルの値をfalsy?
グレモ2012年

どのようにしてその説明結果を取得できたのかわかりません。テーブル定義をコピーしたところ、同じ説明でUNIQ_EMAIL_USERが可能なキーとして表示されています。もう一度確認してください。
piotrm 2012年

OK、トリックを見つけた。user_id最初に使用して制約を定義すると、emailそれはに表示されませんEXPLAIN。これを知っていますか?
gremo 2012年

10
電子メールは(user_id、email)ペアの左端の部分ではないため、機能しません。右端の部分のみを使用してBツリーを下って行を見つけることはできません。
piotrm 2012年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.