【问题标题】:Adding fields to optimize MySQL queries添加字段以优化 MySQL 查询
【发布时间】:2009-12-26 08:22:34
【问题描述】:

我有一个包含 3 个字段的 MySQL 表:

  • 位置
  • 变量
  • 价值

我经常使用以下查询:

SELECT * 
  FROM Table 
 WHERE Location = '$Location' 
   AND Variable = '$Variable' 
ORDER BY Location, Variable

我的表中有超过一百万行,查询速度有些慢。如果我添加一个字段VariableLocation,它是变量和位置的组合,它会提高查询速度吗?我可以将查询更改为:

SELECT * 
  FROM Table 
 WHERE VariableLocation = '$Location$Variable' 
ORDER BY VariableLocation

【问题讨论】:

    标签: sql mysql database-design data-modeling


    【解决方案1】:

    我将为locationvariable 列添加一个覆盖索引:

    ALTER TABLE 
      ADD INDEX (variable, location);
    

    ...如果变量和位置对是唯一的,它们应该是主键。

    合并这些列可能会导致更多的悲伤而不是它的价值。例如,如果您只需要提取locationvariable 的记录,则必须在子查询中对值进行子字符串化。

    【讨论】:

      【解决方案2】:

      尝试添加一个涵盖这两个字段的索引,这样您应该仍然可以获得性能提升,但也可以让您的数据易于理解,因为看起来这两列不应该合并,但您这样做只是为了获得性能。

      【讨论】:

        【解决方案3】:

        我建议不要合并这些字段。相反,创建一个涵盖两个字段的索引,其顺序与您的 ORDER BY 子句相同:

        ALTER TABLE tablename ADD INDEX (location, variable);
        

        组合索引和键仅用于涉及从左到右读取的索引的所有字段或这些字段的子集的查询。或者换句话说:如果您在 WHERE 条件中使用位置,将使用该索引,但按变量排序不会使用该索引。

        在尝试优化查询时,EXPLAIN 命令非常有用:EXPLAIN in mysql docs

        【讨论】:

          【解决方案4】:

          更正更新:

          礼貌:@paxdiablo:

          表中的一列不会有任何区别。您所需要的只是在两列上都有一个索引,MySQL 引擎将使用它。在表中添加一列实际上比这更糟糕,因为它破坏了 3NF 并浪费空间。参见http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html,其中声明:SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2; 如果 col1 和 col2 上存在多列索引,则可以直接获取相应的行。

          【讨论】:

          • -1 - 你能解释一下为什么会在 MySQL 管理数据或优化查询方面发生这种情况吗?
          • 不,至少我不能向你解释,因为我不能像你所做的那样一开始就投票给你!!!
          • 如果您无法根据已知行为来解释某些事情,那么您就没有给出真正的答案。您没有根据说“肯定会提高性能”,因为您不知道它为什么会这样做。事实上,你告诉 OP 她/他想听什么,这充其量是在传播无害的迷信,最坏的情况是会使他/她的查询表现更差。将其与其他发布者进行比较,他们实际上对添加索引进行了合理的解释。
          • @kdgregory 我的经验告诉我,当您执行基准测试时,您会得出结果。谢谢
          • 这个答案完全是垃圾。表中的一列将产生 no 差异。您所需要的只是在两列上都有一个索引,MySQL 引擎将使用它。在表中添加一列实际上比这更糟糕,因为它破坏了 3NF 并浪费空间。参见dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html,其中声明:SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2; 如果 col1 和 col2 上存在多列索引,则可以直接获取相应的行。
          猜你喜欢
          • 2023-03-15
          • 1970-01-01
          • 2012-10-06
          • 2023-03-03
          • 2022-10-24
          • 1970-01-01
          • 2011-01-22
          • 2011-07-07
          • 2018-12-21
          相关资源
          最近更新 更多