索引限制使用表的规则 - MySQL

时间:2011-01-19 19:22:05

标签: mysql indexing

我有一个包含8列的表,其中包含混合数据类型(int,text,varchar等)。

此表只有一个对其进行操作的查询(SELECT),在该查询中,它使用4个“AND”语句来过滤结果。

我的问题是:在这种情况下索引的指导原则是什么?

在我的情况下,读取时间的优先级高于写入时间,因此我应该索引AND子句中出现的所有列吗?我应该只对整数进行索引吗?

3 个答案:

答案 0 :(得分:2)

对于一个查询,请创建一个包含所有受影响列的索引。

MySQL的索引从左到右工作,这意味着如果你有一个包含列的表:

A varchar(255)
B varchar(50)
C int(11)
D datetime

KEY index (A,B,C,D)上的索引意味着MySQL将从左到右查找查询中的列。如果您将它们全部包含在查询中,它将全部使用它们,但如果您只包含AB,它会使用这些来过滤结果,然后将其余条件应用于其余条件结果集(假设您正在使用AND)。

但是,如果您只包含CD,则根本不会使用此索引,因为它不知道在A中要查找的内容。

答案 1 :(得分:2)

如果您快速查看how MySQL uses its indexes,您应该能够找出最佳的索引列。

答案 2 :(得分:0)

我认为你应该为每一列创建一个索引,你需要select语句。请注意,mysql在字段长度上存在限制,您可以在其上创建索引。创建的索引对于MyISAM不能超过1000个字节,对于InnoDb(thx OMG Ponies)不能超过767个。 Here you can find an discussion about assessment of the size of the index for varchars column.如果你没有写入,它应该会显着提高select语句的性能。