我有一个来自行表的查询,其中是只有年和月的日期时间列。日期始终为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的字符串常量。