php - 查询性能的最佳实践是什么?

标签 php mysql sql performance query-performance

关于这个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/

相关文章:

javascript - 如何修复 google places api initMap 不是函数?

javascript - 完整的 Javascript Ajax php 混淆

变量错误中的 Php 标签

mysql - 如果表 B 中不存在键,则从表 A 进行 CASCADE INSERT

sql - 在oracle中使用join更新表而不使用PK

sql - 如何更新作为组合键的一部分并在oracle SQL中充当一个表的主键和其他表中的外键的列

php - 使用 PHP 导出 SQL 表

php - 为什么在 PHP 中不允许 "traditional"类型提示?

php - PHPMyAdmin 中的导入文件大小限制

c# - 第一个程序的规划和开发步骤