【发布时间】:2020-03-12 00:51:52
【问题描述】:
尝试了 3 种不同的方法。
第一
explain select * from test where create_time like '2019-10%';
id|select_type|table|partitions|type|possible_keys |key|key_len|ref|rows |filtered|Extra |
--|-----------|-----|----------|----|--------------------|---|-------|---|-----|--------|-----------|
1|SIMPLE |test | |ALL |test_create_time_IDX| | | |10376| 11.11|Using where|
第二次
explain select * from test where create_time between '2019-10-01 00:00:00' and '2019-10-31 23:59:59';
id|select_type|table|partitions|type |possible_keys |key |key_len|ref|rows|filtered|Extra |
--|-----------|-----|----------|-----|--------------------|--------------------|-------|---|----|--------|---------------------|
1|SIMPLE |test | |range|test_create_time_IDX|test_create_time_IDX|6 | | 5| 100|Using index condition|
第三次
explain select * from test where date_format(create_time,'%Y-%m') = '2019-10';
id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows |filtered|Extra |
--|-----------|-----|----------|----|-------------|---|-------|---|-----|--------|-----------|
1|SIMPLE |test | |ALL | | | | |10376| 100|Using where|
有人告诉我“like 'pattern%'”将使用索引。“like '%pattern%'”、“like '%pattern'”不会。
但是在 1st 条件下,它并没有像我想的那样成功。是因为 create_time 的列类型是 DATETIME 吗?
而且我在官方参考手册中与索引交互时找不到有关所有这些“喜欢”SQL 差异的详细信息。
有人可以与我分享官方链接吗?(我得到的只是传闻)
【问题讨论】:
-
是的,因为它是
DATETIME。它以数字形式存储,而不是作为字符串存储,因此它首先必须将日期转换为字符串,然后才能将其与LIKE模式进行比较。 -
这是重复的,但我的票数不多了。 stackoverflow.com/questions/17101436/…
-
你可能想知道这个:What makes a SQL statement sargable?
标签: mysql date query-optimization where-clause sql-like