2011-05-06 77 views
5

我将索引我在Where/Order中使用的所有列,还有什么可以加速查询的吗?在超过100万行的表上运行查询

的查询是非常简单的,如:

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

我使用PHP 5中,MySQL客户端版本4.1.22,我的表是MyISAM数据。

+0

您是否一次处理所有数据? – Ibu 2011-05-06 22:21:45

+0

尝试计数(1) - 有些人认为没有差异-worth a shot - 也是id数字?另一列可以是不同类型的文本,例如枚举或编号 – Rob 2011-05-06 22:22:30

+3

@Rob:'COUNT(*)'将已经使用索引。 – webbiedave 2011-05-06 22:29:06

回答

7

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

一个很好的通用规则是索引中的列应该按照方差的降序从左到右。也就是说,价值变化最快的列应该是指数中的第一列,并且该列变化最小的列应该是指数中的最后一列。似乎不直观,但你去了。查询优化器喜欢尽可能缩小范围。

1

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

所以你的指标可能是:

user + otherfield1 
user + otherfield2 
etc. 

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

“user + otherfield”索引的好处在于mysql甚至不需要查看数据记录。该索引有一个指针为每个记录,它可以只计数指针。

+0

不,也可以使用myisam索引,只要能够找到所需的所有内容,而不必查看记录以查看比索引中的内容更多的字段。 – dkretz 2011-05-06 23:38:35