在包含超过1百万行的表上运行查询

时间:2011-05-06 22:19:44

标签: php mysql sql aggregate-functions

我正在索引我在Where / Order by中使用的所有列,我还能做些什么来加快查询速度吗?

查询非常简单,例如:

SELECT COUNT(*) 
  FROM TABLE 
 WHERE user = id 
   AND other_column = 'something'`

我使用的是PHP 5,MySQL客户端版本:4.1.22,我的表格是MyISAM。

2 个答案:

答案 0 :(得分:7)

与您的DBA交谈。运行本地等效的showplan。对于像您的示例一样的查询,我怀疑列idother_column上的覆盖索引会大大加快性能。 (我假设user是变量或niladic函数)。

一个很好的一般规则是索引中的列应按方差的降序从左到右。也就是说,值变化最快的列应该是索引中的第一列,而变化最快的列应该是索引中的最后一列。似乎反直觉,但你去。查询优化器喜欢尽可能快地缩小范围。

答案 1 :(得分:1)

如果您的所有查询都包含用户ID,那么您可以假设userid应该包含在每个索引中,可能作为第一个字段。 (我们可以假设用户ID具有高度选择性吗?即任何一个用户都没有超过几千条记录?)

所以你的索引可能是:

user + otherfield1
user + otherfield2
etc.

如果您的用户ID是真的选择性,就像几十条记录一样,那么该字段上的索引应该非常有效(亚秒返回)。

“user + otherfield”索引的好处是mysql甚至不需要查看数据记录。索引有一个指针用于每条记录,它只能计算指针。