1. 索引的顺序要匹配查询条件的顺序:
-- Good: 复合索引是 (col1, col2, col3)
SELECT * FROM table1 WHERE col1 = A AND col2 = B AND col3 = C;
-- Bad: 由于索引顺序不匹配,无法使用复合索引
SELECT * FROM table1 WHERE col2 = B AND col1 = A;
2. 保持查询条件的最左前缀匹配:
-- Good: 复合索引是 (col1, col2, col3)
SELECT * FROM table1 WHERE col1 = A AND col2 = B;
-- Good: 复合索引是 (col1, col2, col3),即使没有 col3 的查询条件,仍然可以使用复合索引
SELECT * FROM table1 WHERE col1 = A;
3. 避免不使用复合索引的情况:
-- Bad: 不会使用复合索引
SELECT * FROM table1 WHERE col2 = B;
-- Bad: 不会使用复合索引
SELECT * FROM table1 WHERE col3 = C;
4. 复合索引的前缀原则:
对于查询条件 WHERE col1 = A AND col2 = B AND col3 = D,如果复合索引是 (col1, col2, col3),则可以有效使用复合索引。但如果查询条件是 WHERE col1 = A AND col2 = B,同样可以使用复合索引,不必再单独建立 (col1, col2) 的索引。
5. 不过度使用复合索引:
建立过多复合索引可能会对表的更新操作(INSERT、UPDATE、DELETE)产生一定的性能影响,因此需要权衡使用。
6. 覆盖索引(Covering Index):
如果查询中的字段都包含在复合索引中,那么数据库可能会直接从索引中获取数据,而不必访问实际的表,这称为覆盖索引。
-- Good: 复合索引是 (col1, col2, col3),并且查询字段都包含在索引中
SELECT col1, col2 FROM table1 WHERE col1 = A AND col2 = B;