MySQL Select 优化

准备:

  create table t(x int primary key,y int unique,z int);

  insert into t(x,y,z) values(1,1,1),(2,2,2),(3,3,3),(4,4,4),(5,5,5),(6,6,6),(7,7,7),(8,8,8),(9,9,9);

情况1:select 没有用到索引

  explain select z from t;

  

  type = all 说明是全表扫描、也就是说把表中的数据都读一遍才得到结果、这种查询通常是非常慢的。为查询加上与之匹配的索引效果会好许多。

情况2:用到了索引

  select y from t;

  

  type = index 说明查询用到了索引、与type=all相比由于不要把整个表载入内存,只要载入索引就可以完成查询、所以数据的读取量就少了。相比type=all通常会快一些。

情况3:

  用到了索引、但是只需要载入索引的一部份就可以完成查询

  select min(y),max(y) from t;

  

  与情况2相比它更加牛逼、table=null说明它不用去表里面找、type=null看起来它索引都没有用到就好像它是从计数器中取到的一样。但是我认为它还是走了索引的,只不过是索引的一小部分。注意它的Extra 说明“Select tables optimized away”

情况4:

  where 条件有索引可用,select 执行count,sum

  select count(y),sum(y) from t where y>3;

  

  key = y 说明使用了索引y、 type = range 说明它不用载入整个索引、只要载入一部分就可以了(y>3的部分)。 

情况5:

  where 段有主键索引可用,select 段是聚合函数

  select sum(x),min(x),max(x),count(x) from t where x>3;

  

  这里我有一个问题就是情况5中的key_len是4情况4中的key_len是5但是x,y可都是int 类型啊!说明一下using index 说明Mysql将使用覆盖索引、using where说明

  存储引擎在扫描时就可以用条件进行过滤、不用扫描整个索引。所以using where + using index 的性能为using index 要好一些。

情况6:

  复合索引对聚合函数的优化(索引头部)

  在这里重新创建一个表

  create table t(x int primary key,y int,z int ,index ix_yz (y,z));//在x 上有聚集索引,(y,z)组成复合索引。

  insert into t(x,y,z) values(1,1,1),(2,2,2),(3,3,3),(4,4,4);

  索引前缀对聚合函数的优化

  select min(y) from t;(这个时候Mysql 不会从表中扫描、有索引前缀就可以了、但是key=null and Select tables optimized away

  

情况7:

  复合索引对聚合函数的优化(索引后缀)

  select min(z) from t;

   

  可以看到用到了索引 ix_yz、说明它没有走了索引。

 

 

 

 

 

 

 

 

 

 

 

 

  

 

 

 

 

 

 

 

posted on 2015-04-03 09:05  蒋乐兴的技术随笔  阅读(787)  评论(0编辑  收藏  举报

导航