我的mysql查询有一个奇怪的行为:
SELECT domain_id, domain_name, domain_lastupdate
FROM domains
WHERE domain_id > 300000 LIMIT 2000
需要~15秒...
,而
SELECT domain_id, domain_name
FROM domains
WHERE domain_id > 300000 LIMIT 2000
需要〜0.05秒...
我尝试过不同限制的不同ID,然后以另一种方式执行缓存结果,但最终会产生戏剧性的时间差异。
我在domain_id上有1个索引,在domain_name上有1个,但没有两个列都有...
我只是不明白......
#domain_lastupdate是一个简单的Date列。
这是两个查询的EXPLAIN输出:
explain SELECT domain_id, domain_name, domain_lastupdate FROM domains WHERE domain_id > 255000 LIMIT 500;
+----+-------------+---------+-------+---------------+-------------+---------+------+----------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+-------+---------------+-------------+---------+------+----------+-------------+
| 1 | SIMPLE | domains | range | UN_domainid | UN_domainid | 4 | NULL | 12575357 | Using where |
+----+-------------+---------+-------+---------------+-------------+---------+------+----------+-------------+
1 row in set (0.00 sec)
第二个:
explain SELECT domain_id, domain_name FROM domains WHERE domain_id > 255000 LIMIT 500;
+----+-------------+---------+-------+---------------+-------------+---------+------+----------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+-------+---------------+-------------+---------+------+----------+--------------------------+
| 1 | SIMPLE | domains | range | UN_domainid | UN_domainid | 4 | NULL | 12575369 | Using where; Using index |
+----+-------------+---------+-------+---------------+-------------+---------+------+----------+--------------------------+
1 row in set (0.01 sec)
知道为什么第一个不使用索引?
答案 0 :(得分:4)
当您提取已编入索引的非日期列时,SQL Server可以直接从索引中提取数据,而无需转到表中。要获得日期,它必须打到桌子上。在日期列上添加索引。
另外我想你可以创建一个多列索引。确保将domain_id作为索引中的第一列。 Creating Indexes
您想要使用的是所谓的A Covering Index