下表中有几百万条记录:
CREATE TABLE `customers` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`store_id` int(10) unsigned DEFAULT NULL,
`first_name` varchar(64) DEFAULT NULL,
`middle_name` varchar(64) DEFAULT NULL,
`last_name` varchar(64) DEFAULT NULL,
`email` varchar(128) DEFAULT NULL,
`phone` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `index_store_email` (`store_id`,`email`),
KEY `index_store_phone` (`store_id`,`phone`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
查询#1大约需要800毫秒:
SELECT COUNT(*) FROM `customers` WHERE `store_id` = 1;
查询#2大约需要1.5毫秒:
SELECT COUNT(*) FROM `customers` WHERE `store_id` = 1 AND `email` IS NULL;
查询#3耗时5秒:
SELECT COUNT(*) FROM `customers` WHERE `store_id` = 1 AND `email` IS NOT NULL;
笔记:
store_id
s,但是每个记录都有一个。email
设置为的客户很少null
。我发现这里有些奇怪:
对这个看似基本的问题有什么想法吗?感觉就像我错过了一些简单的事情。我在DB学校上过课吗?
有时,MySQL查询解析器在决定使用哪个索引时会猜错。对于此类情况,索引提示可能会有用(http://dev.mysql.com/doc/refman/5.7/en/index-hints.html)
强制使用索引:
SELECT * FROM table1 USE INDEX (col1_index,col2_index)
WHERE col1=1 AND col2=2 AND col3=3;
要强制使用索引,包括替换表扫描,请执行以下操作:
SELECT * FROM table1 FORCE INDEX (col1_index,col2_index)
WHERE col1=1 AND col2=2 AND col3=3;
要忽略某个索引:
SELECT * FROM table1 IGNORE INDEX (col3_index)
WHERE col1=1 AND col2=2 AND col3=3;
要调试正在使用的索引,可以使用以下EXPLAIN
语句:(https://dev.mysql.com/doc/refman/5.7/en/explain-output.html)
EXPLAIN SELECT * FROM table1
WHERE col1=1 AND col2=2 AND col3=3;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句