Haruskah saya menentukan indeks terpisah pada email
kolom (untuk tujuan pencarian), atau apakah indeks "secara otomatis" ditambahkan bersama dengan UNIQ_EMAIL_USER
batasan?
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
Jawaban:
Sebuah kunci unik adalah kasus khusus dari indeks, bertindak seperti indeks biasa dengan menambahkan pengecekan untuk keunikan. Menggunakan
SHOW INDEXES FROM customer
Anda 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.
sumber
EXPLAIN
tes menunjukkan nilai yang salah karena tabel kosong?user_id
first dan kemudianemail
tidak muncul diEXPLAIN
. Apakah kamu sadar akan hal ini?