DATE指数(专栏)

时间:2015-02-13 10:23:34

标签: mysql sql

如果我使用以下内容将datedatetime

进行比较
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行。

2 个答案:

答案 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和子查询的查询。

检查行数较少是最好的。