在查询时,MySQL有机会将利用不同索引查询得到的结果进行合并汇总得到最后结果。
举例:SELECT * FROM table_1 WHERE column_1 = value_1 AND column_2 = value_2;
假设table_1上存在索引idx_column1和idx_column2,原本相对合适的索引应该是idx_best = (column_1, column_2)的联合索引,但是现在只有两列单独的索引,因此MySQL可能将原查询拆分成:
SELECT * FROM table_1 WHERE column_1 = value_1;
SELECT * FROM table_1 WHERE column_2 = value_2;
得到两份结果并且取交集(Intersection),特征为Explain查询中Extra栏显示:
Using intersect(idx_column1, idx_column2)
同样:SELECT * FROM table_1 WHERE column_1 = value_1 OR column_2 = value_2;
此时可能会拆分取并集,Extra显示:
Using union(idx_column1, idx_column2)
Explain结果示例:
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
---|---|---|---|---|---|---|---|---|---|
1 | SIMPLE | table1 | index_merge | idx_colulmn1,idx_column2 | column1,idx_column2 | 5,5 | NULL | 8642 | Using union(idx_column1,idx_column2);Using where |
- 错误、低效的索引将会极大降低查询的性能,因为低效的索引拆分查询的结果可能相当大,导致取交集的运算非常缓慢