MySQL:使用 LIKE 或 MONTH 过滤日期列?

doc*_*_id 5 mysql performance performance-tuning

我有一项CRON任务需要从 MySQL InnoDB 表中提取给定月份生日的客户。生日字段已编入索引且类型为DATE

过滤四月,我可以通过以下任一方式查询客户表:

SELECT * 
FROM customers 
WHERE birthday LIKE "2015/04/%";
Run Code Online (Sandbox Code Playgroud)

或者:

SELECT * 
FROM customers 
WHERE MONTH(birthday) = 4;
Run Code Online (Sandbox Code Playgroud)

你会推荐哪一个,为什么?

Low*_*n M 10

DATE用作类型的全部意义在于数据库可以有效地查询数据。这与您将数字存储为 anINT而不是 a 的原因相同VARCHAR- 因此引擎可以做出明智的决定。如果您LIKE在日期上使用运算符,您将失去选择正确数据类型的好处。

使用MONTH(birthday)允许 MySQL 获取它知道符合DATE数据格式的生日列的月份部分。当您使用 时LIKE,它会进行逐个字符的模式匹配,这样做成本更高,速度也更慢。

如果LIKE足够了,那么MONTH()就不存在了。任何内置函数总是会LIKE成为DATE查询的选择。


Ahm*_*sna 5

我会去:

SELECT * 
FROM customers 
WHERE MONTH(birthday) = 4;  
Run Code Online (Sandbox Code Playgroud)

...因为这是按月选择的常用方法。UsingMONTH()会调用 MySQL 中的一个内置函数,但是如果你使用LIKE它会将它作为字符然后进行比较,因此 MySQL 不会执行一个操作,而是执行两个操作。