【问题标题】:What is the best practice for the Performance of the Query?查询性能的最佳实践是什么?
【发布时间】:2018-04-19 22:52:43
【问题描述】:

在这个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 THEN A B THEN A 相关

BUT 如果这些col = 值都不存在,则提取与这组字符串无关的数据,因此如果id 为1, 2, 7, 5 的col 我仍然可以获取其他记录使用,现在这个查询似乎根本无法优化,所以我想到了以下脚本,它在Query 上使用WHERE 而不是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 之上的

【问题讨论】:

  • 但它总是井然有序吗?或者它可以是“S N A F U”而不是“A F N S U”?

标签: php mysql sql performance query-performance


【解决方案1】:

第一次查询

好吧,查询:

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>

【讨论】:

    猜你喜欢
    • 2011-11-21
    • 2021-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多