MySQL查询索引集合优化 / Index Merge

在查询时,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结果示例:

idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
1SIMPLEtable1index_mergeidx_colulmn1,idx_column2column1,idx_column25,5NULL8642Using union(idx_column1,idx_column2);Using where
  • 错误、低效的索引将会极大降低查询的性能,因为低效的索引拆分查询的结果可能相当大,导致取交集的运算非常缓慢
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值