索引知识点补充
Posted 专注,坚持
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了索引知识点补充相关的知识,希望对你有一定的参考价值。
一、索引中包含like关键字
- 在索引列上使用like该列会不会使用到索引?
- 在联合索引上前面索引字段使用like之后后面的列上会不会用到索引?
如果索引字段上使用 like \'%xxx\',这种不会用到索引,后面的索引也不会用到,如果格式为 like \'xxx%\',这种可以用到索引,而且不影响后面的索引使用。
对于某些订单号比较长的,在使用的时候可能会反转一下用到索引,因为输入单号的后几位比较符合使用习惯。反转的目的就是可以用到索引。
举例如下:
对于user表,索引列为(name,age),依次执行下面的语句:
1、like \'xxx%\'格式:可以用到索引
explain select * from user where name like \'ab%\'
执行结果如下:使用到了索引
后面如果有其它索引也是没有问题的
explain select * from user where name like \'zz%\'and age = 1;
2、like \'%xxx\'格式:不会用到索引
explain select * from user where name like \'%zz\';
后面如果有其它索引也不会用到
explain select * from user where name like \'%zz\'and age = 1;
执行结果如下:没有用到索引
二、优化sql语句的过程
- profile的使用(profile:个人资料)
1、查看profile是否打开
show variables like \'%profil%\';
显示如下:
OFF 为未打开。使用下面语句打开:
set profiling = 1;
2.、执行sql语句之后,执行查询语句:
show profile for query 1;
显示如下:
其中:红框里面的比较重要,左面是执行中的一个节点,右面是该过程耗时
列 | 含义 |
optimizing | 优化 |
statistics | 统计 |
preparing | 准备 |
executing | 执行 |
Sending data | 发送数据 |
三、mysql如何执行关联查询
对于下面的连接查询,MySQL执行步骤
SELECT A.a,B.b FROM A INNER JOIN B ON A.c = B.c;
MySQL对任何关联查询都执行嵌套循环关联操作,即MySQL先在一个表中循环取出单条数据,然后再嵌套到下一个表中寻找匹配的行,依次下去,直到找到所有表中匹配的行为止。然后根据各个表匹配的行,返回查询中需要的各个列。
结合上面的例子,执行步骤如下:(假设优化器优化的关联顺序为A,B)
- 执行SQL语句:SELECT A.a,A.c FROM A;查出来的结果不妨记为:A_rows
- 执行SQL语句:SELECT B.b FROM B WHERE B.c = A_rows.c
- 然后返回查询中的各个列。
四、索引经验总结
1、如果查询的数据量比较大,MySQL可能会优化为不用索引,也就是说,查询的数据量过多时,不适用用索引。
2、什么情况下使用全表扫描要比使用索引快??
查询结果的记录数量小于表中记录一定比例的时候。这个主要是由于索引扫描后要利用索引中的指针去逐一访问记录,假设每个记录都使用索引访问,则读取磁盘的次数是查询包含的记录数T,而如果表扫描则读取磁盘的次数是存储记录的块数B,如果T>B 的话索引就没有优势了。对于大多数数据库来说,这个比例是10%(oracle,postgresql等),即先对结果数量估算,如果小于这个比例用索引,大于的话即直接表扫描。
以上是关于索引知识点补充的主要内容,如果未能解决你的问题,请参考以下文章