zoukankan      html  css  js  c++  java
  • Mysql 查询优化及索引优化总结

    本文为博主原创,转载请注明出处:

    一。Mysql 索引的优缺点:

      优点:加快数据的检索速度,这是应用索引的主要用途; 使用唯一索引可以保证数据的唯一性

      缺点: 索引也需要占用物理空间,并不是索引越多越好,若索引过多,也会导致数据检索效率降低

    二。Mysql 索引设计原则:

      1.联合索引尽量覆盖条件

        让每一个联合索引都尽量去包含sql语句里的where、order by、group by的字段,还要确保这些联合索引的字段顺序尽量满足sql查询的最左前缀原则。

      2. where与order by冲突时优先where

        一般这种时候往往都是让where条件去使用索引来快速筛选出来一部分指定的数据,接着再进行排序。因为大多数情况基于索引进行where筛选往往可以最快速度筛选出你要的少部分数据,然后做排序的成本可能会小很多。

      3. 限制索引的数目

        索引的数目不是越多越好。每个索引都需要占用磁盘空间,索引越多,需要的磁盘空间就越大。修改表时,对索引的重构和更新很麻烦。越多的索引,会使更新表变得很浪费时间。

      4. 选择区分度高的列作为索引

        尽量选择区分度高的列作为索引,区分度的公式是count(distinct col)/count(*),表示字段不重复的比例,比例越大我们扫描的记录数越少,唯一键的区分度是1,且mysql 使用B+树,当索引值之间的区分度越大,则越能发挥B+ 树的优势,若区分度小,则发挥不出索引的优势

      5. in 和 or 查询索引使用规则

        in和or在表数据量比较大的情况会走索引,在表记录不多的情况下会选择全表扫描

      6. like KK% 一般情况都会走索引 

        like 模糊查询中,右模糊查询(abc%)会使用索引,而(%abc)和(%abc%)会放弃索引而使用全表扫描

      7. where 与 order by 的索引优化

        MySQL支持两种方式的排序filesort和index,Using index是指MySQL扫描索引本身完成排序。index效率高,filesort效率低。如果order by的条件不在索引列上,就会产生Using filesort;

        order by满足两种情况会使用Using index:1.order by语句使用索引最左前列。2.使用where子句与order by子句条件列组合满足索引最左前列。

      8. in 与 exist 优化

        原则:小表驱动大表,即小的数据集驱动大的数据集

        in:当B表的数据集小于A表的数据集时,in优于exists

    select * from A where id in (select id from B)

        exists:当A表的数据集小于B表的数据集时,exists优于in

    select * from A where exists (select 1 from B where B.id = A.id)

        EXISTS (subquery)只返回TRUE或FALSE

       9. count(*) 查询优化

        字段有索引:count(*)≈count(1)>count(字段)>count(主键 id) //字段有索引,count(字段)统计走二级索引,二级索引存储数据比主键索引少,所以count(字段)>count(主键 id)    

        字段无索引:count(*)≈count(1)>count(主键 id)>count(字段) //字段没有索引count(字段)统计走不了索引,

        count(主键 id)还可以走主键索引,所以count(主键 id)>count(字段)

        count(1)跟count(字段)执行过程类似,不过count(1)不需要取出字段统计,就用常量1做统计,count(字段)还需要取出字段,所以理论上count(1)比count(字段)会快一点。
        count(*) 是例外,mysql并不会把全部字段取出来,而是专门做了优化,不取值,按行累加,效率很高,所以不需要用count(列名)或count(常量)来替代 count(*)。
        为什么对于count(id),mysql最终选择辅助索引而不是主键聚集索引?因为二级索引相对主键索引存储数据更少,检索性能应该更高,mysql内部做了点优化(应该是在5.7版本才优化)。

     

  • 相关阅读:
    第三次作业
    最后一次作业
    第14.15周作业
    第七周作业
    第六周作业
    第四周作业
    第三周作业
    第二周作业
    第一周作业
    第0次作业
  • 原文地址:https://www.cnblogs.com/zjdxr-up/p/15626869.html
Copyright © 2011-2022 走看看