繁体   English   中英

添加字段以优化MySQL查询

[英]Adding fields to optimize MySQL queries

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

  • 位置
  • 变量

我经常使用以下查询:

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

我的表中有一百万多行,查询有些慢。 如果添加了VariableLocation Variable和Location相结合的字段VariableLocation ,它将提高查询速度吗? 我将能够将查询更改为:

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

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

ALTER TABLE 
  ADD INDEX (variable, location);

...虽然变量和位置对是唯一的,但它们应该是主键。

合并这些列可能会引起更多的痛苦。 例如,如果您只需要按locationvariable提取记录,则必须对子查询中的值进行子字符串化。

尝试添加一个覆盖两个字段的索引,然后您应该仍然可以提高性能,但也可以使您的数据易于理解,因为这似乎不应该将两列结合在一起,而您只是在这样做以获得性能。

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

ALTER TABLE tablename ADD INDEX (location, variable);

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

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

更正更新:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM