关系型数据库---MYSQL---优化

Posted anpeiyong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关系型数据库---MYSQL---优化相关的知识,希望对你有一定的参考价值。

1、为什么要进行SQL优化?

    1.1  查询性能低

    1.2  执行时间过长

    1.3  等待时间过长

    1.4  SQL写的太差(尤其是多表关联查询)

    1.5  索引失效

    1.6  服务器参数(缓存、线程数)设置不合理

    1.7  项目需求不合理

    ......

    程序员关注的主要是SQL索引

2、MySQL执行过程

    2.1  前言:

          mysql服务器在接收到客户端发来的SQL语句,是不能够马上执行该SQL语句;

          该SQL需要进行一系列复杂的过程,最终转变为二进制的机器码,才能被执行;

    2.2  SQL执行流程

        技术图片

        技术图片

 

    2.3  SQL执行顺序

        技术图片

 

     2.4  SQL优化的目标

          主要是对索引的有效使用

3、数据库索引

    3.1

    3.2  案例

      技术图片

 

      索引的目的减少磁盘的IO次数,从而提升性能

          【扩展】:

              一个3层的B+树的数据结构,可以容纳上百万条数据,查询某个数据,只需要3次IO,效率极高;

    3.3  索引的利弊

          

              减少IO次数,提高查询效率;

              降低CPU的使用率;

          

              占用磁盘的存储空间(索引本身也是文件);

              不适用索引的情况:

                  数据量小的表;

                  频繁变动的字段;

                  不经常查询的字段;

                  对增删改操作效率降低(需要重新维护索引);

              【备注】:

                  查询优化器  会对  使用索引、不使用索引  进行比对,如果发现不使用效率更高,则不会使用索引(索引的使用与否  由  查询优化器  决定);

    3.4  索引的分类

          同一张表  可以有  多个不同的索引

          3.4.1  主键索引

          3.4.2  单列索引

                单独对表中的某个列做索引(根据需求);

          3.4.3  唯一索引

                该列数据中没有重复数据,都是唯一的;

          3.4.4  复合索引

                项目中使用最多的;

                实际需求中  往往是按照多个条件进行查询,而mysql在查询时只会选择其中一个做索引(最优的  执行计划

                复合索引的规则比较严格;

     3.5  SQL执行计划

          3.5.1  前言

                SQL语句执行之前SQL优化器  会对   SQL语句  进行优化和调整,最后生成最优的SQL执行计划

                最终执行的SQL不一定是我们当初编写的SQL;

          3.5.2  查看SQL执行计划

                explain SQL语句;

          3.5.3  执行计划详解

                技术图片

 

                idSQL执行的序列号

                    如果有多个,数字大的优先执行;如果相同,依次执行;

                select_type查询的类型

                    技术图片

 

                table数据来自哪张表;

                type:显示   连接使用哪种类别有无使用索引(explain工具分析最重要的);

                    技术图片

                    技术图片

                possible_keys可以使用的索引

                 key:SQL执行时真正用到的索引

                 key_lenmysql决定使用的键长度

                    长度越短越好;

                ref:参数类型;

                rows:要达到结果,必须搜索多少行数据;

                Extra:mysql解决问题的详细信息(关键参考项之一);

                     技术图片

4、SQL优化

    4.1  适当使用索引

        4.1.1  建索引的原则

              a,频繁作为查询条件的字段建索引,eg:关联查询的外键...

              b,唯一性差 的字段,不适合 单独创建索引;

                 c,更新频繁的字段,不合适建索引;

              d,不会出现在where语句中的字段,不适合建索引;

        4.1.2  join的原则

              a,不要使用inner join ,原因是SQL执行顺序;

              b,数据量小的表写在join左边,数据量大的写在join的右边;

                  mysql中的join使用Nested Loop join来实现(循环嵌套):

                      数据量小的为外层循环、数据量大的为内层循环,最后合并结果

              c,优先优化内层循环;

              d,保证join语句中  被作为连接条件的字段已经建立了索引;

              e,扩大缓冲区的大小,容纳更多的查询数据(BDA的职责);

以上是关于关系型数据库---MYSQL---优化的主要内容,如果未能解决你的问题,请参考以下文章

Mysql索引优化之索引的分类

架构设计:系统存储——MySQL数据库性能优化

MySql 查询优化父子关系

MySql之单机优化

Mysql 索引优化分析

mySql索引优化分析