MySQL优化

  好记性不如烂笔头,索性本身整理一下。sql

MySQL优化多多方面的,包括查询优化,更新优化,和服务器优化,数据库

目的是为了使MySQL减小IO次数,提升反应速度,运行更快,减小资源占用缓存

查询优化服务器

  原则是优化更须要优化的SQL,什么事更须要优化的SQL呢,就是执行频率很高的的SQL并发

  影响性能的缘由:性能

    CPU致使?IO引发?数据访问所致?数据运算影响?大数据

  为了肯定是哪方面的问题引发,咱们须要使用到查看SQL的执行计划   EXPLAIN + sql语句优化

   咱们根据主键id查询一个用户的信息,查看他的执行计划spa

   

   查询出来的结果为:设计

   

   咱们对其中比较重要也就是须要咱们关注的字段进行一下说明:

    type : 表示表的链接类型,表明这条sql语句的的执行效率断定,有如下值

      =system : 最高级,通常不会出现

      =const : 根据查询条件,只有一行符合查询条件,通常是以主键或惟一键做为条件查询

            能够理解为 ,这就是咱们平常中最好的一种状态了

      

      =eq_ref  : 联表查询,通常用于使用 = 比较带索引的列-->  u.id  o.id都带索引

      

        =ref : 查询条件没有主键索引,也没有惟一索引,通常出现于 = ,>, <操做带有其余索引的列       

      

      =ref_or_null : 和ref相似,包含了能够搜索NULL值的行,通常出现与在子查询中

     上面这五种是属于比较理想的一种索引使用状况,下面来看看不怎么样的

      =index_merge

      =unique_subquery

      =index_subquery

      =range      :只检索给定范围的行 好比 age>18,使用一个索引来选择行

      =index        : 比ALL好一点

      =ALL       : 完整扫描,性能最差的一个状态

   有些说的太模糊了,我暂时没搞懂什么意思,下面继续看其余重要字段的意思

   possible_keys字段:

    表示咱们的sql语句能够经过什么索引来找到改行 好比primarykey

        若是显示为NULL,则表示没有使用索引,全表扫描,效率极低

   key字段:

    显示sql查询中实际使用到的索引d的字段,若是没有显示为NULL

      能够强制使用索引或者忽略索引,以下

    

其余的字段就显得不怎么重要了,不作参考。

经过查看执行计划,咱们就能够以此为着手点进行优化,下面说说优化的的手法:

 先理解一下索引:适当的索引能够加快查询速度,但若是索引过多,胆儿影响速度,在此基础上

    咱们能够为一下不常修改且常常被做为查询条件的字段添加索引,提升检索效率;

  1.尽可能不要在数据库作运算,咱们应该吧运算放在service层,具备更好的扩展;

  2.尽可能不使用反向查询 好比 !=  ,not in,<>....等;

  3.尽可能不要使用Like关键字,若是迷糊查询字段开头就模糊 ,不会使用索引 好比  ‘%汉三’;

  4.使用 or 关键字时,只有当先后两个条件字段都为索引时,索引才会生效;

  5这个有点多,不搬砖了,给一个截图吧,hahhahaha 

    

    

 固然更多优化是方方面面的,具体状况具体分析下面来看看插入优化:

  插入数据时,影响插入速度的主要元素是: 索引,主键的惟一性的校验,一次性插入数据的条数

  优化手段和选择的储存引擎的不一样而不一样,在MySQL中经常使用的储存引擎有 InnoDB 和 MyISAM ;

  下面咱们简单介绍一下这两种比较经常使用的储存引擎: MyISAM  和 InnoDB

    MyISAM是ISAM的加强,在MySQL5.5以前的默认储存引擎 ( 不包括5.5版本 ),不支持事务,外键;

    使用一种表格锁定的机制,优化多个并发的读的操做,代价为须要常常运行 optimize table命令,

      来恢复被更新机制所浪费的空间;

    MyISAM强调了快速读取的操做,读取数据性能是非明显,这可能也是MySQL火的缘由之一;

    MyISAM的一个重要缺陷为,不能再表损坏后恢复数据,因此须要常常备份实时数据

    说说为何MyISAM储存引擎查询数据会特别快,咱们经过他/它生成的文件来看

      .frm  :表结构信息

      .MYD : 数据文件     (理解为 My Data)

      .MYI : 表的索引信息  (理解为 My Index)

      经过上面三个文件,咱们在插入数据时,若是where后面的条件为有索引的条件,

        就会查询表的索引信息文件,该文件能够看做一个K-V结构,若是该条件有对应的索引,  

        就会获得一个该索引对应在本地磁盘中的一个具体的的物理地址,因此查询效率很是优秀

        于此同时,他的增删盖就特别的慢,每次变动数据,都要维护数据和索引信息,

        若是索引列过多,查询效率也会相对下降

     经常使用的优化手段为:

      禁用索引:

          在插入数据时,会对插入的数据创建索引,咱们能够禁用索引,在数据插入完成后,再开启索引

          若是咱们插入的表是一张空表的话,则无需操做,MyISAM引擎的表实在导入数据后才创建索引的

          禁用索引: alter table table_name disable keys

          开启索引:alter table table_name enable keys

        禁用惟一性检查: 

          惟一性检查会下降咱们插入数据的速度

          咱们在批量插入数据前禁用惟一性检查,插入后开启惟一性检查

          禁用惟一性检查: set unique_checks = 0

          开启惟一性检查: set unique_checks = 1      

          采用批量的方式插入数据; 这个不作过多介绍,values () , () , ();

          使用 load data infile 语句 批量插入数比 insert 快,暂时没用过,不作介绍;

   InnoDB储存引擎的出现可能就是为了弥补 MyISAM不支持事务,外键而横空出世的;

      在MySQL5.5(含)及以上的默认储存引擎,支持事务,外键,查询效率相对下降;

      InnoDB是出路据大数据量的最大性能设计,CPU的优化效率是其余引擎不能匹敌的;

      InnoDB是第三方开发的,被MySQL整合,在内存中缓存数据和索引以维持缓冲池;

      InnoDB的特色:支持事务,支持外键,锁定机制的改进,数据多版本的读取,

    InnoDB常见优化手段:              

      禁用惟一性检查;

           用法和MyISAM 一致          

      禁用外键检查;  

           外键检查影响插入数据的效率,先关闭,插入完成后再开启便可

           关闭 : set foreign_key_checks = 0;

           开启 : set foreign_key_checks = 1;

      禁用自动提交; 

           禁止事务的自动提交 ,插入完成后统一提交,提升效率

           禁用: set autocommit = 0;

           开启: set autocommit = 1;

 

    MySIAM 和 innoDB 的区别以及如何抉择?

        

      若是咱们以查询为主,基本没有什么增删改,对事务的要求也特别低,就能够选择MyISAM;

        MyISAM在系统崩溃后,数据恢复很困难,是多能够接受?

      在MySQL5.5版本后,MySQL默认的储存引擎已经默认为InnoDB,说明InnoDB也有必定的优点;

查询和插入数据的优化已经作了简单的 说明,下面记录一下服务器的优化

    第一个就是服务器所在机器的性能决定MySQL数据库的性能,内存,固态硬盘,处理器...

    第二个就是软性能的提高了,在机器给定的状况下,优化MySQL的参数:

      优化相关参数能够提升资源利用率,从而提升服务器性能

      MySQL的配置参数都在my.conf或者my.ini中,

      找到该配置文件,搜索 SQL server  

      

    能够优化的相关参数:

       

      

      

      

      

      

      

       

暂时就这么多吧,往后有新的知识点再修复补全

相关文章
相关标签/搜索