如果日期列在我的查询的SELECT部分​​中,为什么我的查询会更慢?

时间:2012-03-24 05:30:26

标签: mysql sql

我的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)

知道为什么第一个不使用索引?

1 个答案:

答案 0 :(得分:4)

当您提取已编入索引的非日期列时,SQL Server可以直接从索引中提取数据,而无需转到表中。要获得日期,它必须打到桌子上。在日期列上添加索引。

另外我想你可以创建一个多列索引。确保将domain_id作为索引中的第一列。 Creating Indexes

您想要使用的是所谓的A Covering Index