MySQL最左匹配原则
在MySQL中,最左匹配原则是指在使用复合索引(即包含多个列的索引)进行查询操作时,查询条件从索引的最左列开始匹配,并且必须是连续的。这个原则非常重要,因为它影响到查询时索引的使用效率。
复合索引类似于电话簿的排序方式:首先按照姓氏排序,然后是名字,最后是电话号码。如果你要查找一个人的电话号码,首先你会按姓氏查找(最左侧),然后是名字。如果你不知道姓氏只知道名字,这样的查找效率会大大降低。
在MySQL中,考虑一个复合索引包括三列:(col1, col2, col3)。以下是几个使用这个复合索引有效(或无效)的例子,依据最左匹配原则:
-
有效的使用案例:
WHERE col1 = 'A':使用了索引的最左列。WHERE col1 = 'A' AND col2 = 'B':连续使用了索引的前两列。WHERE col1 = 'A' AND col2 = 'B' AND col3 = 'C':连续使用了所有索引列。WHERE col1 = 'A' ORDER BY col2:即使第二个条件是排序而非过滤,也使用了前两列。
-
部分有效的使用案例:
WHERE col1 = 'A' AND col3 = 'C':虽然使用了索引的第一列和最后一列,但由于跳过了中间的列,所以对col3的过滤不会利用到索引。
-
无效的使用案例:
WHERE col2 = 'B':没有使用最左列col1,因此复合索引不会被使用。WHERE col3 = 'C':没有使用最左列col1,也没有中间列col2,索引不会被使用。WHERE col2 = 'B' AND col3 = 'C':没有从最左列开始,因此索引不会被充分利用。
要充分利用复合索引的优势,查询应尽可能从索引的最左列开始,并沿着索引定义的顺序连续使用列。这样,MySQL查询优化器可以有效地定位和过滤数据,提高查询效率。如果查询中使用了索引的非连续列,数据库可能会采用索引跳转扫描(Index Skip Scan),效率较低,或者干脆不使用索引。
有些地方称为联合索引?
联合索引和复合索引其实是同一个概念的不同说法,在MySQL中完全可以互换使用。它们都是指在数据库表的多个列上创建的一个索引,数据结构中的索引项是基于这些列的组合值构建的。
复合索引(又称联合索引)中包含了多个列,因此它们的性能和使用特点与单一列索引不同。如前所述,复合索引在查询中遵循最左前缀规则,即在进行查询时从复合索引的最左边的列开始使用索引进行检索和匹配。这种索引可以极大地提高通过这些列进行查询和排序操作的效率。
总的来说,“联合索引”和“复合索引”这两个术语在MySQL数据库环境中指的是同一种索引,可以根据个人习惯选择使用。在进行数据库设计和查询优化时,了解并应用复合索引是非常重要的。