一、索引中包含like关键字 



  • 在索引列上使用like该列会不会使用到索引?
  • 在联合索引上前面索引字段使用like之后后面的列上会不会用到索引?

如果索引字段上使用 like '% xxx',这种不会用到索引,后面的索引也不会用到,如果格式为 like 'xxx%',这种可以用到索引,而且不影响后面的索引使用。



对于某些订单号比较长的,在使用的时候可能会反转一下用到索引,因为输入单号的后几位比较符合使用习惯。反转的目的就是可以用到索引。



举例如下:



 对于user表,索引列为(name,age),依次执行下面的语句:



1、like 'xxx%'格式:可以用到索引



explain select * from user where name like 'ab%'



使用到了索引



 

alter 索引 索引like_关联查询


后面如果有其它索引也是没有问题的


explain select * from user where name like 'zz%'and age = 1;


alter 索引 索引like_字段_02

不会用到索引


explain select * from user where name like '%zz';


alter 索引 索引like_字段_03


后面如果有其它索引也不会用到


explain select * from user where name like '%zz'and age = 1;


执行结果如下:没有用到索引


alter 索引 索引like_字段_04

二、优化sql语句的过程


  • profile的使用(profile:个人资料)

1、查看profile是否打开


show variables like '%profil%';


显示如下:


alter 索引 索引like_字段_05


 OFF 为未打开。使用下面语句打开:


set profiling = 1;


2.、执行sql语句之后,执行查询语句:


show profile for query 1;


显示如下:


alter 索引 索引like_alter 索引_06

其中:红框里面的比较重要,左面是执行中的一个节点,右面是该过程耗时



含义

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. 然后返回查询中的各个列。


四、索引经验总结 


不用索引,也就是说,查询的数据量过多时,不适用用索引。


2、什么情况下使用全表扫描要比使用索引快??


       查询结果的记录数量小于表中记录一定比例的时候。这个主要是由于索引扫描后要利用索引中的指针去逐一访问记录,假设每个记录都使用索引访问,则读取磁盘的次数是查询包含的记录数T,而如果表扫描则读取磁盘的次数是存储记录的块数B,如果T>B 的话索引就没有优势了。对于大多数数据库来说,这个比例是10%(oracle,postgresql等),即先对结果数量估算,如果小于这个比例用索引,大于的话即直接表扫描。