我想找到更好的方法,主要是在我的数据库中的性能问题。通配符 LIKE,还是范围搜索?
让我们有这张表:
| id INT | created DATE | some other columns ... |
如果我想选择某个月创建的条目,我可以考虑两种选择。一个是在一个范围内搜索的一对比较:
SELECT * FROM my_table WHERE created >= '2014-09-01' AND created < '2014-10-1'
第二个是通配符 LIKE:
... WHERE created LIKE '2014-09-%'
我创建了一个包含数百个条目的虚拟表,分为三个月。当我在两种情况下运行选择(禁用缓存和在列上创建索引)时,时间大致相同 - 第一个更快,第二个更快。在旧的 Atom CPU 上,时间在 4.0 到 5.0 毫秒之间。
在我看来,从性能的角度来看,我将使用哪一个并不重要。这是对的吗?还是会出现几千行的差异?
谢谢
最佳答案
通配符前缀几乎使优化器无法使用索引,我猜想执行范围查询(尤其是日期 types)总是比字符串比较更好。
加上几行数据并不能说明问题:数据缓存的差异、其他进程使用的 CPU 将超过 ms 的差异。
编辑:但重申一下,这里的主要内容是将日期与日期进行比较,而不是将日期与字符串进行比较。这会在某个阶段反咬你一口。
例如
where created >= STR_TO_DATE('2014-09-01','%Y-%m-%d')
and created < STR_TO_DATE('2014-10-01','%Y-%m-%d')
关于MySQL - LIKE 尾随通配符与范围搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25915991/