如果我使用以下内容将date
与datetime
SELECT * FROM `calendar` WHERE DATE(startTime) = '2010-04-29'
我还可以使用startTime
上的索引吗?
创建索引后:
create index mi_date on calendar(startTime);
解释结果:
+----+-------------+--------------+-------+---------------+---------+---------+------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------------+-------+---------------+---------+---------+------+------+--------------------------+
| 1 | SIMPLE | calendar | index | NULL | mi_date | 6 | NULL | 25 | Using where; Using index |
+----+-------------+--------------+-------+---------------+---------+---------+------+------+--------------------------+
并使用查询
SELECT * FROM `calendar` WHERE startTime like '2010-04-29 %'
解释cmd:
+----+-------------+--------------+-------+---------------+---------+---------+------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------------+-------+---------------+---------+---------+------+------+--------------------------+
| 1 | SIMPLE | calendar | index | mi_date | mi_date | 6 | NULL | 25 | Using where; Using index |
+----+-------------+--------------+-------+---------------+---------+---------+------+------+--------------------------+
第一个解释之间的差异是列possible_keys
不为空。
还有这个问题:
SELECT * FROM `calendar` WHERE startTime BETWEEN '2010-04-29 00:00:00' AND '2010-04-29 23:59:59'
解释:
+----+-------------+--------------+-------+---------------+---------+---------+------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------------+-------+---------------+---------+---------+------+------+--------------------------+
| 1 | SIMPLE | calendar | range | mi_date | mi_date | 6 | NULL | 16 | Using where; Using index |
+----+-------------+--------------+-------+---------------+---------+---------+------+------+--------------------------+
列类型是范围,扫描的行不仅仅是16,这是我查询的结果。
p.s:我的桌子上有25行。
答案 0 :(得分:3)
使用EXPLAIN
mysql> EXPLAIN SELECT * FROM `calendar` WHERE DATE(startTime) = '2010-04-29'
你可以使用mysql检查索引。但通常MySQl不会#39;使用DATE()使用索引。
尝试
SELECT * FROM `calendar` WHERE startTime BETWEEN '2010-04-29 00:00:00' AND '2010-04-29 23:59:59'
答案 1 :(得分:1)
您可以知道在查询之前添加“说明”,这将使用正在使用的键进行报告。通常使用函数会禁用索引搜索,但您可以完全使用修改查询的索引:
SELECT * FROM `calendar` WHERE startTime like '2010-04-29 %'
好吧,正如你在Explain的结果中看到的,在这种情况下(你的,使用日期(..))mysql已经在使用索引了。检查参考字段:
ref - 显示与索引进行比较的列或常量 在关键列中命名。 MySQL将选择一个常量值 比较或基于查询执行计划的列本身。您可以 在下面给出的例子中看到这一点。
哪个更好?在这一点上,它们可能是相同的。您可以尝试其他查询并查看行字段。
rows - 列出检查以生成的记录数 输出。这是另一个值得关注优化的重要专栏 查询,尤其是对于使用JOIN和子查询的查询。
检查行数较少是最好的。