写 SQL 查询时有效使用复合索引

90 阅读1分钟

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;