【发布时间】:2011-01-19 19:22:05
【问题描述】:
我有一个包含混合数据类型(int、text、varchar 等)的 8 列的表
该表只有一个对其进行操作的查询(一个 SELECT),并且在该查询中它使用 4 个“AND”语句来过滤结果。
我的问题是:在这种情况下建立索引有哪些指导方针?
在我的例子中,读取时间的优先级高于写入时间,所以我应该索引出现在 AND 子句中的所有列吗?我应该只索引整数吗?
【问题讨论】:
我有一个包含混合数据类型(int、text、varchar 等)的 8 列的表
该表只有一个对其进行操作的查询(一个 SELECT),并且在该查询中它使用 4 个“AND”语句来过滤结果。
我的问题是:在这种情况下建立索引有哪些指导方针?
在我的例子中,读取时间的优先级高于写入时间,所以我应该索引出现在 AND 子句中的所有列吗?我应该只索引整数吗?
【问题讨论】:
对于一个查询,创建一个包含所有受影响列的索引。
MySQL 的索引从左到右工作,这意味着如果您有一个包含列的表:
A varchar(255)
B varchar(50)
C int(11)
D datetime
KEY index (A,B,C,D) 上的索引意味着 MySQL 将从左到右查找查询中的列。如果您将它们全部包含在查询中,它将全部使用它们,但如果您仅包含 A 和 B,它将使用这些过滤结果,然后将其余条件应用于剩余的结果集(假设你正在使用AND)。
但是,如果您只包含C 和D,它根本不会使用此索引,因为它不知道在A 中查找什么。
【讨论】:
如果您快速浏览一下how MySQL uses its indexes,您应该能够找出要索引的最佳列。
【讨论】:
我认为您应该为您的选择语句所需的每一列创建一个索引。请注意,mysql 对字段长度有限制,您可以在其上创建索引。 MyISAM 创建的索引不能超过 1000 字节,InnoDb 不能超过 767(感谢 OMG Ponies)。 Here you can find an discussion about assessment of the size of the index for varchars column. 如果您没有写入,它应该会显着提高 select 语句的性能。
【讨论】: