mysql⼀次会⽤⼏个索引_mysql多条件查询索引为什么只⽤到
⼀个?
在⽹上看⼀些⽂章的时候,发现好⼏次下⾯这样的话:
如果经常需要同时对两个字段进⾏AND查询,那么使⽤两个单独不如建⽴⼀个复合索引,因为两个单独索引通常数据库只能使⽤其中⼀个,⽽使⽤复合索引因为索引本⾝就对应到两个字段上的,效率会有很⼤提⾼。
自学javascript基础但是,往往都没有说为什么?想知道以下问题:
1、是不是在任何情况下数据库查询⼀次只会使⽤到⼀个索引?discuz论坛安装教程
2、如果不是,那么什么情况下只会使⽤⼀个索引?
3、那分别是什么造成上⾯的查询索引使⽤问题呢?
与其说是“数据库查询只能⽤到⼀个索引”,倒不是说是 和全表扫描/只使⽤⼀个索引的速度⽐起来,去分析两个索引⼆叉树更加耗费时间,所以绝⼤多数情况下数据库都是是⽤⼀个索引。
如这条语句:
select count(1) from table1 where column1 = 1 and column2 = 'foo' and column3 = 'bar'
我们来想象⼀下当数据库有N个索引并且查询中分别都要⽤上他们的情况:directions染发膏
mysql面试题索引查询优化器(⽤⼤⽩话说就是⽣成执⾏计划的那个东西)需要进⾏N次主⼆叉树查[这⾥主⼆叉树的意思是最外层的索引节点],此处的查流程⼤概如下:
radiogroup的使用查出第⼀条column1主⼆叉树等于1的值,然后去第⼆条column2主⼆叉树查出foo的值并且当前⾏的coumn1必须等于1,最后去column主⼆叉树查bar的值并且column1必须等于1和column2必须等于foo。
如果这样的流程被查询优化器执⾏⼀遍,就算不死也半条命了,查询优化器可等不及把以上计划都执⾏⼀遍,贪婪算法(最近邻居算法)可不允许这种情况的发⽣,所以当遇到以下语句的时候,数据库只要⽤到第⼀个筛选列的索引(column1),就会直接去进⾏表扫描了。
flex框架select count(1) from table1 where column1 = 1 and column2 = 'foo' and column3 = 'bar'
所以与其说是数据库只⽀持⼀条查询语句只使⽤⼀个索引,倒不如说N条独⽴索引同时在⼀条语句使⽤的消耗⽐只使⽤⼀个索引还要慢。
所以如上条的情况,最佳推荐是使⽤index(column1,column2,column3) 这种联合索引,此联合索引可以把b+tree结构的优势发挥得淋漓尽致:
⼀条主⼆叉树(column=1),查询到column=1节点后基于当前节点进⾏⼆级⼆叉树column2=foo的查询,在⼆级⼆叉树查询到
column2=foo后,去三级⼆叉树column3=bar查。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论