我想找到什么是更好的方法,主要是在我的数据库中的性能问题。通配符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-%'
我创建了一个包含几百个条目的虚拟表,分为三个月。当我运行带有两个条件的select(在列上创建禁用的缓存和索引)时,时间大致相同 - 一次比第一次快,另一次是第二次。在旧的Atom CPU上,时间介于4.0到5.0毫秒之间。
在我看来,从性能来看,我将使用哪一个并不重要。这是对的吗?或者会出现数千行的差异?
由于
答案 0 :(得分:3)
通配符前缀几乎使优化器无法使用索引,我猜测执行范围查询(尤其是日期 类型 )总是如此比字符串比较好。
另外,一些数量不足的指标不会出现这种情况:数据缓存的差异,其他进程使用的CPU将超过ms的差异。
编辑:但重申一下,这里的主要内容是将日期与日期进行比较,而不是将日期与字符串进行比较。那会在某个阶段再次咬你。
e.g。
where created >= STR_TO_DATE('2014-09-01','%Y-%m-%d')
and created < STR_TO_DATE('2014-10-01','%Y-%m-%d')
答案 1 :(得分:2)
在我的系统上测试了两个(约700万行),两种方法都可以使用索引,差异可以忽略不计。
但是,我的建议是;使用日期范围..它在表面上更有意义。
此外,您可能会在其他地方使用范围来进行数据过滤,但使用LIKE
无法实现。例如created >= CURDATE() - INTERVAL 2 DAY
。
使用范围可以保持代码的一致性。
另外,我可能会将您的查询更改为:
SELECT * FROM my_table WHERE created >= '2014-09' AND created < '2014-10'
显而易见,没有使用这一天。