MySQL - LIKE与尾随通配符和范围搜索

时间:2014-09-18 14:53:03

标签: mysql sql wildcard date-range

我想找到什么是更好的方法,主要是在我的数据库中的性能问题。通配符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毫秒之间。

在我看来,从性能来看,我将使用哪一个并不重要。这是对的吗?或者会出现数千行的差异?

由于

2 个答案:

答案 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'

显而易见,没有使用这一天。