深入了解Mysql的B+Tree索引道理
索引有哪些?
索引是为了加快对表中数据行的检索而新建的一种分散存储的数据构造。
索引的工作机制是如何的?
当进行匹配的时候,会把字符串转换成ascll码,如abc酿成97 98 99,然后从左往右一个字符一个字符进行对照。所以在sql查询中运用like %a 时候索引会失效,由于%表示全匹配,要是已经全匹配就不需要索引,还不如直接全表扫描。
3、最少空间准则
前面已经说过,当关键字占用的空间越小,则每个节点保留的关键字个数就越多,每次加载进内存的关键字个数就越多,检索效率就越高。
结合索引:
单列索引:节点中的关键字[name]
结合索引:节点中的关键字[name, phoneNum]
可以把单列索引看成特别的结合索引,结合索引的比拼也是依据最左匹配准则。
结合索引列的选中准则:
(1) 时常用的列优先(最左匹配准则)
(2) 离散度高的列优先(离散度高准则)
(3) 宽度小的列优先,(最少空间准则)
下面简略举例平时时常会碰到的题目:
如,平时时常运用的查询sql如下:
Select * from users where name = ?
Select * from users where name = ? and pahoneNum = ?
为了加速检索速度,为上面的查询sql新建索引如下:
Create index idx_name on users(name)
Create index idx_name_phoneNum on users(name, phoneNum)
在上面解决方案中,依据最左匹配准则,idx_name为冗余索引, where name = ?一样可以应用索引idx_name_phoneNum进行检索。冗余索引会增减保护B+TREE均衡时的机能耗损,而且占用磁盘空间。
遮盖索引:
要是查询的列,通过索引项的信息可直接返回,则该索引称之为查询SQL的遮盖索引。遮盖索引可以提高查询的效率。
下面通过例子注明遮盖索引。
表:teacher
索引:PK(id), key(name, phoneNum), unique(teacherNo)
下面哪些sql运用到了遮盖索引?
Select teacherNo from teacher where teacherNo = ?
:运用到了,检索到teacherNo 时候,可以直接将索引中的teacherNo 值返回,不需要进入数据区。
Select id,teacherNo from teacher where teacherNo = ?
:运用到了,辅助索引的叶子节点保留了主索引的值,所以检索到辅助索引的叶子节点的时候就可以之间返回id。
Select name,phoneNum from teacher where teacherNo = ?
:没实用到
Select phoneNum from teacher where name = ?
, 运用到了。
晓得了遮盖索引,就晓得了为何sql中请求尽量不要运用select *,要写明概括要查询的字段,一个缘由就是,这样在运用到遮盖索引的状况下,不需要进入到数据区,数据就能直接返回,提拔了查询效率。
通过前面的学习,我们可以很容易的明确如下一下结论:
1、索引列的数据长度知足业务的状况下能少则少。
2、表中的索引并不是多多益善。
3、Where 前提中,like 9%, like %9%, like%9,三种方式都用不到索引。后两种方式关于索引是无效的。首先种9%是不肯定的,决议于列的离散型,结论上讲可以用到,要是发明离散状况特殊差的状况下,查询优化器觉得走索引查询机能更差,还不如全表扫描。
4、Where前提中 NOT IN 没法运用索引
5、多用指定查询,只返回本人想要的列,少用select *。
6、查询前提中运用函数,索引将会失效,这和列的离散型有关,一旦运用到函数,函数拥有不肯定性。
7、结合索引中,要是不是按照索引最左列开端查寻,没法运用索引。
8、对结合索引精准匹配最左前列并范畴匹配另一列,可以运用到索引。
9、结合索引中,要是查询有某个列的范畴查询,其右侧所有的列都没法运用索引。
举荐Mysql教程《Mysql教程》
以上就是深入了解Mysql的B+Tree索引道理的细致内容,更多请关注 百分百源码网 其它相干文章!