Apakah batasan UNIK secara otomatis membuat INDEX di bidang?

97

Haruskah saya menentukan indeks terpisah pada emailkolom (untuk tujuan pencarian), atau apakah indeks "secara otomatis" ditambahkan bersama dengan UNIQ_EMAIL_USERbatasan?

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;

EDIT : seperti yang disarankan oleh Corbin saya bertanya EXPLAIN SELECT * FROM customer WHERE email = 'address'pada tabel kosong. Ini hasilnya, saya tidak tahu bagaimana menafsirkannya:

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

Saat menambahkan IXD_EMAIL ke tabel, kueri yang sama menunjukkan:

id select_type type possible_keys key       key_len ref   rows Extra
1  SIMPLE      ref  IDX_EMAIL     IDX_EMAIL 257     const 1    Using where
gremo
sumber
1
Batasan UNIK secara teknis tidak memerlukan indeks ... tetapi tidak yakin bagaimana standar mendefinisikannya atau MySQL (yang backend, btw?) Mengimplementasikannya. Yang dapat saya temukan di MySQL secara manual dengan cepat adalah "Indeks UNIK membuat batasan sehingga semua nilai dalam indeks harus berbeda.".
Anda perlu menerapkan & menguji dengan indeks individu vs penutup (komposit AKA - lebih dari satu kolom). Itu tergantung pada penggunaan, dan data.
OMG Ponies
3
Saya 99% yakin bahwa itu memang membuat indeks. Buat saja tabel dengan unik lalu lakukan penjelasan di pilih dengan tempat.
Corbin
@Corbin melakukannya, bagaimana saya harus menafsirkan hasilnya?
gremo
Apakah itu menggunakan kendala unik sebagai indeks? Anda mungkin perlu menggunakan tabel yang sangat besar, atau mungkin hanya melakukan pemindaian tabel.
Corbin

Jawaban:

115

Sebuah kunci unik adalah kasus khusus dari indeks, bertindak seperti indeks biasa dengan menambahkan pengecekan untuk keunikan. Menggunakan SHOW INDEXES FROM customerAnda dapat melihat kunci unik Anda sebenarnya adalah indeks tipe pohon-B.

Sebuah indeks komposit pada (email, user_id)cukup, Anda tidak perlu indeks terpisah pada email hanya - MySQL dapat menggunakan bagian paling kiri dari indeks komposit. Mungkin ada beberapa kasus perbatasan di mana ukuran indeks dapat memperlambat kueri Anda, tetapi Anda tidak perlu mengkhawatirkannya sampai Anda benar-benar menemukannya.

Sedangkan untuk menguji penggunaan indeks, Anda harus terlebih dahulu mengisi tabel Anda dengan beberapa data untuk membuat pengoptimal berpikir bahwa indeks itu sebenarnya layak digunakan.

piotrm.dll
sumber
Jadi EXPLAINtes menunjukkan nilai yang salah karena tabel kosong?
gremo
Saya tidak yakin bagaimana Anda berhasil mendapatkan hasil penjelasan itu, saya baru saja menyalin definisi tabel Anda dan penjelasan yang sama menunjukkan UNIQ_EMAIL_USER sebagai kunci yang mungkin, dapatkah Anda memeriksanya kembali?
piotrm
Oke, temukan triknya. Ketika batasan didefinisikan menggunakan user_idfirst dan kemudian emailtidak muncul di EXPLAIN. Apakah kamu sadar akan hal ini?
gremo
10
Ini tidak berfungsi karena email bukan bagian paling kiri dari pasangan (user_id, email). Anda tidak dapat turun ke b-tree untuk menemukan baris Anda hanya dengan menggunakan bagian paling kanan.
piotrm