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

标签 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-%'

我创建了一个包含数百个条目的虚拟表,分为三个月。当我在两种情况下运行选择(禁用缓存和在列上创建索引)时,时间大致相同 - 第一个更快,第二个更快。在旧的 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/

相关文章:

mysql - 如何在 windows xp 上启动 MySQL 服务器

mysql - 将 8 个字符的 unix 时间戳转换为日期时间

android - 如何使用子域的通配符构建多源可信 Web Activity

sql - 在同一张表上使用子查询在 MySQL 中编写 sql 查询

java - 在 Java 中,如何使用 posix 通配符语法从多个文件中读取数据?

wildcard - 文件夹中带有扩展名的 .gitignore 文件

mysql - Node.js脚本通过socket.io连接MySQL数据库

mysql - SQL分区在mysql中使用 'not exists'

mysql - 使用 Mysql 选择语句

mysql - 按组排序的数据