blu*_*row 9 mysql datetime between sql-like
我只是发现mysql可以使用如下方式查询datetime:
like '2013-06-12%'
Run Code Online (Sandbox Code Playgroud)
我认为它不能使用索引.我谷歌,但直接找不到这样的主题.所以我使用3308614记录的表进行了测试.第一个SQL:
SELECT * FROM subscription t WHERE DATE(t.active_time) = '2013-06-30';
Run Code Online (Sandbox Code Playgroud)
我们都知道这个SQL不能使用索引,需要4秒才能得到结果.第二个SQL:
SELECT * FROM subscription t WHERE t.active_time LIKE '2013-06-30%';
Run Code Online (Sandbox Code Playgroud)
我不知道它是否可以使用索引,但它也需要4秒.第三个SQL:
SELECT * FROM subscription t WHERE t.active_time > '2007-11-30' AND t.active_time < '2007-12-01';
Run Code Online (Sandbox Code Playgroud)
我们都知道第三个SQL可以使用索引,它需要0.016秒.
所以我认为'like'在查询datetime字段时不能使用索引,因为mysql应该首先将datetime字段转换为字符串并将字符串发送到like命令.它是否正确 ?
Ran*_*eed 16
假设t.active_time类型是DATETIME,
由于函数调用,以下查询无法使用索引.在与之比较之前,所有active_time必须在运行中转换为DATE值'2013-06-30'.此字符串DATE在第一个位置转换为值,这在查询的最开始只发生一次.
SELECT * FROM subscription t WHERE DATE(t.active_time) = '2013-06-30';
Run Code Online (Sandbox Code Playgroud)
第二个查询不能出于类似的原因使用索引.您实际上正在进行字符串比较(因为LIKE运算符).所有active_time值都会即时转换为字符串.
SELECT * FROM subscription t WHERE t.active_time LIKE '2013-06-30%';
Run Code Online (Sandbox Code Playgroud)
只有最后一个可以使用索引.在这种情况下,字符串'2007-11-30'和转换'2007-12-01'为DATETIME,因为<和>运算符允许这样做.
SELECT * FROM subscription t WHERE t.active_time > '2007-11-30' AND t.active_time < '2007-12-01';
Run Code Online (Sandbox Code Playgroud)
后者也适用于=和BETWEEN运营商.
有关信息,所有类型都可以与LIKE运算符的字符串进行比较,遇到与上述相同的问题,因为它需要隐式转换.
t.active_time = '2013-06-30'没有按预期工作,因为'2013-06-30'被转换为一个DATETIME值,也就是说'2013-06-30 00:00:00'.
对于这种情况,一种替代方法是执行以下操作:
SELECT *
FROM subscription t
WHERE t.active_time BETWEEN '2013-06-30 00:00:00' AND '2013-06-30 23:59:59';
Run Code Online (Sandbox Code Playgroud)
最后你会得到当天发生的所有事件。
| 归档时间: |
|
| 查看次数: |
18260 次 |
| 最近记录: |