关于这个Table我使用这个脚本:
$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';
}
我使用ORDER BY
是因为我想先提取重要数据,即与col = A B C D E
THEN A B C D
THEN相关的任何数据A B C
然后AB
然后A
BUT 如果这些 col =
值都不存在,则提取与这组字符串无关的数据,因此如果 id 1 的 col , 2, 7, 5
我仍然得到其他记录来使用,现在这个查询似乎根本无法优化,所以我考虑了以下使用 WHERE
的脚本而不是 Query 上的 ORDER BY
:
$SQL = "
SELECT id, col
FROM t
WHERE 'A B C D E' LIKE CONCAT(col, '%')
ORDER BY col DESC;
";
$stmt = $connect->prepare($SQL);
$stmt->execute();
if ($stmt->rowCount > 0) {
. . PULL_DATA . .
} else {
$SQL = "
SELECT id, col
FROM t
ORDER BY col DESC;
";
$stmt = $connect->prepare($SQL);
$stmt->execute();
if ($stmt->rowCount > 0) {
. . PULL_DATA . .
} else {
echo 'No Data Pulled';
}
}
这是保持性能的好方法还是有更好的方法?
<小时/>为了防止混淆,A B C D E
不是静态字符串,而是变量,
而且并不总是字母,
它可以是诸如 Hello My World
之类的单词,其中查询按 Hello My World
然后 Hello My
然后 Hello 对值进行排序
这个查询是建立在这个 Question 之上的。
最佳答案
第一个查询
那么,查询:
SELECT id, col
FROM t
ORDER BY CASE WHEN 'A B C D E' LIKE CONCAT(col, '%') THEN col END DESC;
选择表中的所有行。您无法在此处使用任何优化,因为 order by
表达式会根据查询而变化。无法创建对任何订单有帮助的索引。
第二个查询
第二个查询可以优化。如果您知道 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>
关于php - 查询性能的最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49931398/