建立多列复合索引的时候,你实际上建立了 MySQL 可以使用的多个索引。复合索引可以作为多个索引使用,因为索引中 最 左边的列集合都可以用于匹配数据行。这种列集合被称为"最左前缀"(它与索引 某个列的前缀不同,那种索引把某个列的前面几个字符作为索引值)。 假设你在表的 state、city 和 zip 数据列上建立了复合索引。索引中的数 据行按照 state/city/zip 次序排列,因此它们也会自动地按照 state/city 和 state 次序排列。 这意味着, 即使你在查询中只指定了 state 值, 或者指定 state 和 city 值,MySQL 也可以使用这个 索引。因此,这个索引可以被用于搜索如下 所示的数据列组合: state, city, zip state, city state MySQL 不能利用这个索引来搜索没有包含在最左前缀的内容。例如,如果 你按照 city 或 zip 来搜索,就不会使用到这个索引。如果你搜索给定的 state 和具体的 ZIP 代码(索引的 1 和 3 列),该索引也是不能用于这种组合值的,尽 管 MySQL 可以利用索引来查找匹配的 state 从而缩小搜索的范 围。 不要过多地索引。不要认为"索引越多,性能越高",不要对每个数据列都进 行索引。我们在前面提到过,每个额外的索引都会花费更多 的磁盘空间,并降 低写操作的性能。当你修改表的内容的时候,索引就必须被更新,甚至可能重新 整理。如果你的索引很少使用或永不使用,你就没有必要减小表的 修改操作的 速度。此外,为检索操作生成执行计划的时候,MySQL 会考虑索引。