zoukankan      html  css  js  c++  java
  • 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、说明它没有走了索引。

      

     

  • 相关阅读:
    【转】SQL SERVER函数无法执行对数据库的修改语句
    【转】用SQL实现树的查询
    HTML: < 和 > 是何方神圣
    ASP.NET的一些小问题
    C#的MD5哈希值计算
    高度自适应的CSS
    [转]WCF类型共享技巧
    使用.net的跟踪诊断来记录wcf消息
    【转】js frame 框架编程
    js点击button按钮跳转到页面代码
  • 原文地址:https://www.cnblogs.com/JiangLe/p/4389100.html
Copyright © 2011-2022 走看看