SQL选择WHERE中的DATE,什么更快



我有一个来自行表的查询,其中是只有年和月的日期时间列。日期始终为01,时间为00:00:00

使用php查询选择数据时,什么更快?

$date = "2020-04";
$query = "SELECT * FROM table WHERE datum LIKE ?",$date ;

$date = "2020-04";
$rok = substr($mesic,0,4);
$mesic = substr($mesic,5,2);
$query = "SELECT * FROM table WHERE YEAR(datum) = ? AND MONTH(datum) = ?",$rok,$mesic; 

该表包含100千行

我们过去总是有这样的规则:

"避免WHERE子句中的函数">

背景是数据库服务器必须进行表扫描,以计算每一行的函数结果(即使它只是键表(。所以他不能有效地使用钥匙!

LIKE更快!如果你使用键的开头(在你写的时候(,它也可以有效地使用它。

我建议:

$date = "2020-04";
$sql = "SELECT * FROM table WHERE datum = concat(?, '-01')", $date;

基本思想不是在被搜索的列上应用函数(日期函数或模式匹配(,因为这会阻止数据库充分利用该列上的索引(并且会对每一行进行不必要的额外计算(。相反,您可以通过连接查询中的变量来轻松生成要搜索的确切值。

在更典型的情况下,datum有真实的日期和时间分量,并且您想在给定的月份进行筛选,您可以执行以下操作:

SELECT *
FROM table
WHERE datum >= concat(?, '-01') AND datum < concat(?, '-01') + interval 1 month

请注意,这假设您使用的是MySQL,因为语法表明了这一点。其他数据库也有类似的方法从字符串中构建日期。

两者都没有。在这两种情况下,datum列都有一个函数调用。用CCD_ 3和CCD_。使用LIKE,您将转换为字符串。两者都阻碍了索引的优化和使用。

正确的结构是:

where datum >= ? and
datum < ? + interval 1 month  -- syntax might vary depending on the database

其中CCD_ 6是月初的参数占位符。我建议您在应用程序中将其构造为一个日期常量或规范形式YYYY-MM-DD的字符串常量。