zoukankan      html  css  js  c++  java
  • MySQL优化

      好记性不如烂笔头,索性自己整理一下。

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

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

    查询优化

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

      影响性能的原因:

        CPU导致?IO引起?数据访问所致?数据运算影响?

      为了确定是哪方面的问题引起,我们需要使用到查看SQL的执行计划   EXPLAIN + sql语句

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

       

       查询出来的结果为:

       

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

        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  

          

        可以优化的相关参数:

           

          

          

          

          

          

          

           

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

  • 相关阅读:
    import 和 from … import 模块的变量、方法引用差异
    python引入模块的五种方式与内置模块
    webdriver定位元素的方法和基础函数的使用
    mysql update语句 in执行效率优化
    服务器配置jupyter notebook
    安装CUDA和cuDNN
    Linux命令后台运行
    Ubuntu查看系统信息(CPU、GPU信息)
    Linux下scp用法简析
    如何解决“This app is damaged and can’t be opened. You should move it to the Trash”
  • 原文地址:https://www.cnblogs.com/msi-chen/p/10655379.html
Copyright © 2011-2022 走看看