索引知识点补充

一、索引中包含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)
  1. 执行SQL语句:SELECT A.a,A.c FROM A;查出来的结果不妨记为:A_rows
  2. 执行SQL语句:SELECT B.b FROM B WHERE B.c = A_rows.c
  3. 然后返回查询中的各个列。

四、索引经验总结 

1、如果查询的数据量比较大,MySQL可能会优化为不用索引,也就是说,查询的数据量过多时,不适用用索引。
2、什么情况下使用全表扫描要比使用索引快??
       查询结果的记录数量小于表中记录一定比例的时候。这个主要是由于索引扫描后要利用索引中的指针去逐一访问记录,假设每个记录都使用索引访问,则读取磁盘的次数是查询包含的记录数T,而如果表扫描则读取磁盘的次数是存储记录的块数B,如果T>B 的话索引就没有优势了。对于大多数数据库来说,这个比例是10%(oracle,postgresql等),即先对结果数量估算,如果小于这个比例用索引,大于的话即直接表扫描。
原文地址:https://www.cnblogs.com/uodut/p/7071142.html