代码之家  ›  专栏  ›  技术社区  ›  Toleo

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

  •  0
  • Toleo  · 技术社区  · 8 年前

    关于这个 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 然后 A B C D 然后 A B C 然后 A B 然后 A

    但是 如果没有这些 col = 值存在,以提取与这组字符串不相关的数据,因此如果 1, 2, 7, 5 我仍然可以使用其他记录,现在这个查询似乎根本不可能优化,所以我考虑了以下使用 WHERE 而不是 订购人 Query :

    $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 然后 Hello 这个查询是基于 Question

    1 回复  |  直到 8 年前
        1
  •  0
  •   The Impaler    8 年前

    第一次查询

    那么,问题是:

    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>