我应该在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;
字符串
EDIT:根据Corbin的建议,我在空表上查询了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
型
2条答案
按热度按时间wj8zmpe11#
SHOW INDEXES FROM customer
你可以看到你的unique key实际上是B树类型的索引。(email, user_id)
上的 * 复合索引 * 就足够了,你不需要只在电子邮件上使用单独的索引- MySQL可以使用复合索引的最左边部分。可能会有一些边界情况,索引的大小会减慢你的查询速度,但你不应该担心它们,直到你真正遇到它们。至于测试索引的使用情况,你应该首先用一些数据填充你的表,让优化器认为它实际上值得使用该索引。
ui7jx7zq2#
除了上面的答案之外,还可以使用HASH键创建一个唯一的索引,在这种情况下,优化器将无法使用它来查找行。https://mariadb.com/kb/en/getting-started-with-indexes/#unique-index