
建立了ABC联合索引INDEX idx_abc (A, B, C)各种查询条件是否会走ABC联合索引核心在于查询条件是否满足最左前缀匹配原则查询条件必须从索引最左列开始连续匹配查询条件简写是否可能走idx_abc实际利用程度说明是否满足最左前缀A会用到 A满足B不会不用不满足缺少最左列 AAB会用到 A、B满足连续命中前两列AC会用到AMySQL 5.6 以前C不能用于连续定位5.6 可能通过 ICP 在索引层过滤不满足因为跳过了B所以不能完整利用(A,B,C)5.6 前通常在 Server 层判断C5.6 可能在存储引擎层先判断C从而减少回表是否回表取决于是否覆盖索引BC不会不用不满足缺少最左列 AABC会用到 A、B、C满足完整命中CBA会用到 A、B、C满足优化器会重排为ABCABC满足A或B不一定用到 A会用B用不到A则后面也不用比较复杂OR逻辑要拆成两个分支看A?分支满足最左前缀B?分支不满足最左前缀因此整体是否走联合索引不稳定A或A会用到 A满足类似A IN (...)A IN B会用到 A、B满足IN可视为多个等值匹配A IN B IN C会一般可用 A、B、C满足都是等值匹配较友好A范围会用到 A 范围满足从 A 开始做范围扫描A范围 B会主要用 A满足A 已经是范围B 通常不能继续精确定位A B范围会用到 A、B满足B 作为范围条件A B范围 C会用到 A、BC 多数过滤满足B 范围之后C 通常不能继续定位A前缀LIKE会用到 A 范围满足如A LIKE abc%A后缀LIKE不会不用不满足如A LIKE %abc上面查询语法的完全写法简写示例语法ABCWHERE A ? AND B ? AND C ?A或BWHERE A ? OR B ?A IN B IN CWHERE A IN (?, ?) AND B IN (?, ?) AND C ?A B范围 CWHERE A ? AND B ? AND C ?A前缀LIKEWHERE A LIKE abc%