Php 查询性能的最佳实践是什么?
在这方面,我使用以下脚本:Php 查询性能的最佳实践是什么?,php,mysql,sql,performance,query-performance,Php,Mysql,Sql,Performance,Query Performance,在这方面,我使用以下脚本: $SQL = " SELECT id, col FROM t ORDER BY CASE WHEN 'A B C D E' LIKE CONCAT(col, '%') THEN col END DESC; "; $stmt = $connect->prepare($SQL); $stmt->execute(); if ($stmt->rowCount > 0) { . . PULL_DATA . . } else {
$SQL = "
SELECT id, col
FROM t
ORDER BY CASE WHEN 'A B C D E' LIKE CONCAT(col, '%') THEN col END DESC;
";
$stmt = $connect->prepare($SQL);
$stmt->execute();
if ($stmt->rowCount > 0) {
. . PULL_DATA . .
} else {
echo 'No Data Pulled';
}
我使用了orderby,因为我想先提取重要的数据,这与col=abcde
然后abcdd
然后abc
然后abc
然后abc
但是如果这些col=
值都不存在,则提取与这组字符串不相关的数据,因此如果id的col1、2、7、5
我仍然可以使用其他记录,此时此查询似乎根本无法优化,所以我想到了下面的脚本,它使用WHERE
而不是
这是保持性能的好方法还是有更好的方法
为避免混淆,
A B C D E
不是一个静态的字符串,而是一个变量
而且它不总是字母
它可以是像
Hello My World
这样的词,其中查询通过Hello My World
然后Hello My
对值进行排序,然后Hello
,并且此查询是基于第一次查询构建的
那么这个问题:
SELECT id, col
FROM t
ORDER BY CASE WHEN 'A B C D E' LIKE CONCAT(col, '%') THEN col END DESC;
选择表中的所有行。这里没有可以使用的优化,因为每个查询的orderby
表达式都会更改。无法创建对任何订单都有帮助的索引
第二次查询
第二个查询可以优化。如果您知道col
具有最小长度,则可以对其进行优化,即使长度为1个字符(希望更长)
对于本例,假设col
的最小长度为三个字符。然后我将为这三个头部字符创建索引,如下所示:
alter table t add (col_head as substring(col, 1, 3));
create index ix1_t on t (col_head);
然后添加一个额外的条件,这似乎是多余的。此附加条件将尝试使用比全表扫描快得多的索引范围扫描表访问模式:
SELECT id, col
FROM t
where col_head = substring('A B C D E', 1, 3)
and 'A B C D E' LIKE CONCAT(col, '%')
ORDER BY col DESC;
注意1:参数“A B C D E”在SQL中添加了两次
注2:更改前后,检索MySQL正在使用的执行计划,查看是否有任何差异。要检索执行计划,请运行:
explain <my_query>
解释
但它是否总是井然有序?或者它可以是‘N A F U’而不是‘A F N S U’?
explain <my_query>