我应该在列上 定义一个单独的索引email(出于搜索目的),还是该索引是“自动”与UNIQ_EMAIL_USER约束一起添加的?
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'在空桌上查询。这是结果,我不知道如何解释:
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
一个 独特的关键 是指数的一个特例,像个与独特性增加检查的常规指标。使用SHOW INDEXES FROM customer您可以看到您的唯一键实际上是B树类型索引。
SHOW INDEXES FROM customer
一个 综合指数 上(email, user_id)是不够的,你不需要只电子邮件单独的索引- MySQL能使用复合指数的最左边的部分。在某些边界情况下,索引的大小可能会使查询变慢,但是在真正遇到它们之前,您不必担心它们。
(email, user_id)
至于测试索引的使用,您应该首先在表中填充一些数据,以使优化程序认为使用该索引确实值得。