添加字段以优化MySQL查询

时间:2009-12-26 08:22:35

标签: sql mysql database-design data-modeling

我有一个包含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

4 个答案:

答案 0 :(得分:6)

我会为列locationvariable添加覆盖索引:

ALTER TABLE 
  ADD INDEX (variable, location);

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

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

答案 1 :(得分:2)

尝试添加一个涵盖这两个字段的索引,然后你应该继续提高性能,同时保持数据的可理解性,因为看起来似乎不应该将两列合并,但你只是为了获得性能。< / p>

答案 2 :(得分:2)

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

ALTER TABLE tablename ADD INDEX (location, variable);

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

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

答案 3 :(得分:-1)

更正更新:

礼貌:@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上存在多列索引,则可以直接获取相应的行。