• 目的
    避免出现页面访问错误
    慢查询造成页面无法加载
    阻塞造成数据无法提交
    优化从sql及索引,数据库结构,系统配置,硬件
  • 日志
    慢查询日志:
      
     show variables like 'slow_query_log'
     set global slow_query_log_file='日志地址';
    set global slow_query_log=on;
    set global log_queries_not_using_indexes=on;//未使用索引
    set global long_query_time=1
    show variables like 'slow_query_log%';#查询慢日志状态是否开启k
    show variables like 'long_query_time';#显示多久时间要被记录
    show global variables like 'long_query_time';#
    set GLOBAL long_query_time = 1;#设置时间为1秒
    set GLOBAL SLOW_QUERY_LOG = 1;#开启慢查询日志 set GLOBAL LOG_QUERIES_NOT_USING_INDEXES = 1;#开启记录查询中不带索引的
     
  • 日志分析
    mysql自带的工具:mysqldumpslow
    pt输出到文件:pt-query-digest slow-log > slow_log.report
    pt输出到数据库:pt_query-digest slow.log -review \h=127.1,D=test,p=root,P=3306,u=root,t=query_review --create-reviewtable --review-history t= hostname_slow
  • 通过日志查找到问题
    1.查询次数多且每次查询占用时间长的sql:pt-query-digest分析的前几个查询
    2.I/O大的sql:注意pt-query-digest分析中的Rows examine项
    3.未命中索引的sql:注意pt-query-digest分析中Rows examine和Rows send的对比。
  • 分析具体sql
    explain 返回各列含义:

      talbe:数据表
      type: 显示连接使用何种类型,从最好到差:const,eq_reg,ref,reange,index,all
            possible_keys:显示可能应用到这张表的索引,为空是没有可能索引
      key:实际用到的索引,为null则没有使用索引
      key_len:使用的索引的长度,在不损失精确性情况下,长度越短越好
      ref:显示索引的哪一列被使用,如果可能的话,是一个常数
      rows:msyql认为必须检查的用来返回请求数据的行数
            extra:Using filesort:看到这个查询就需要优化了,mysql需要进行额外的步骤来发现如何对返回的行排序,它根据连接类型及存储排序键值和匹配条件的全部行的行指针来排序全部行。
         Using temporary:这个也需要优化了,mysql需要创建一个临时表来存储结果,这通常发生在对不同的列集进行order by 上,而不是group by 上。

  • 具体例子
    count():count(*)含null的列,count(列)不含null的列
    max(列):一般通过建立对列的索引来优化
    子查询的优化:通常把子查询优化成join查询,优化时要注意关联建是否有一对多的关系,要注意重复数据(使用distinct)。
    group by 优化:两个表关联查询优化成子查询方式
    limit优化:常用于分页处理,时常会伴随order by 从句使用,因此大多时候会使用filesorts这样会造成大量的io问题。优化步骤1,使用有索引的列或主键进行order by 操作,2.记录上次返回的主键,在下次查询时使用主键过滤,避免过多扫描表。
  • 索引优化:
    where,group by ,order by ,on 从句中出现的列建立索引,索引字段越小越好,离散度大的列放到联合索引的前面(离散度是指重复率)。

   索引查询快,但插入更改慢

  • 查找重复索引
    使用 

    use information_schema;
    select a.TABLE_SCHEMA AS '数据名'
    ,a.table_name AS '表名'
    ,a.index_name AS '索引1'
    ,b.index_name AS '索引2'
    ,a.COLUMN_NAME AS '重复列名'
    FROM STATISTICS a JOIN STATISTICS b ON
    a.TBLE_SCHEMA=b.TABLE_SCHEMA AND a.TABLE_NAME=b.table_name
    AND a.SEQ_IN_INDEX=b.SEQ_IN_INDEX AND a.COLUMN_NAME=b.COLUMN_NAME WHERE a.SEQ_IN_INDEX=1 AND a.INDEX_NAME<>b.INDEX_NAME

    使用工具,pt_duplicate-key-checker

    pt-duplicate-key-checker
    -uroot
    -p ''
    -h 127.0.0.1

    分析不用的索引,配合慢查询日志

    pt-index-usage
    -uroot -p'pwd'
    mysql-slow.log
  • 数据库结构优化:
      数据类型:使用可以存下你的数据的最小的数据类型,使用简单的数据类型,Int比varchar在处理上要简单,尽可能的使用not null定义字段,少用text类型,非用可考虑分表。
    使用int来存储日期,利用FROM_UNIXTIME(),UNIX_TIMESTAMP()两个函数来转化。
    使用bigint存ip地址,利用INET_ATON(),INET_NTOA()两个函数来转换。
  • 范式优化与返范式优化
    第三范式:不存在非关键字对任意候选关键字段的传递函数依赖。
  • 表的垂直拆分
    原则:不常用的字段放在一个表中,大字段放到一个表中,经常使用的字段放在一起
  • 表的水平拆分
  • 系统优化
    操作系统配置优化:网络方面的配置,要修改/etc/sysctl.conf文件,
    增加tcp支持的队列数
    net.ipv4.tcp_max_syn_backlog=65535
    减少断开连接时,资源回收
    net.ipv4.tcp_max_tw_buckets=8000
    net.ipv4.tcp_tw_reuse=1
    net.ipv4.tcp_tw_recycle=1
    net.ipv4.tcp_fin_timeout=10 打开文件数的限制,ulimit -a查看,可修改/etc/security/limits.conf
    soft nofile 65535
    hard nofile 65535
  • mysql配置文件优化
    mysql通过启动时指定配置参数和使用配置文件两种方法进行配置,mysql查找配置文件的顺序可以通过:$/usr/sbin/mysqlId --verbose --help | grep -A 1'Default options'

    innodb_buffer_pool_size非常重要的一个参数,用于配置Innodb的缓冲池,如果数据库中只有Innodb表,则推荐配置量为总内存的75%

    SELECT ENGINE,ROUND(SUM(data_length+index_length)/1024/1024,1) AS "Total MB"
    FROM INFORMATION_SCHEMA.TABLES WHERE table_schema not in
    ("information_schema","performance_schema")
    GROUP BY ENGINE; innodb_buffer_pool_size>=Total MB
    innodb_buffer_pool_instances 可以控制缓冲池的个数,默认情况下只有一份。
    innodb_log_buffer_size 缓冲的大小,由于日志最长每秒就会刷新,所以不用太大
    innodb_flush_log_at_trx_commit 关键参数,对innodb的IO效率影响很大,默认值为1,一般建议设为2。如果数据安全性要求高就用1.
    innodb_read_io_threads\innodb_write_io_threads 两个参数决定读写的io进程数,默认为4
    innodb_file_per_table 关键参数,控制Innodb每一个表使用独立的表空间,默认为off,也就是所有表会建立在共享表空间中,表空间不会自动收缩,建立设为on。
    innodb_stats_on_metadata 决定什么情况下会刷新innodb表的统计信息,建议设为off
  • 第三方工具配置

          

mysql数据库优化学习的更多相关文章

  1. 关于MySQL数据库优化的部分整理

    在之前我写过一篇关于这个方面的文章 <[原创]为什么使用数据索引能提高效率?(本文针对mysql进行概述)(更新)> 这次,主要侧重点讲下两种常用存储引擎. 我们一般从两个方面进行MySQ ...

  2. 【MySQL】花10分钟阅读下MySQL数据库优化总结

    1.花10分钟阅读下MySQL数据库优化总结http://www.kuqin.com2.扩展阅读:数据库三范式http://www.cnblogs.com3.my.ini--->C:\Progr ...

  3. 30多条mysql数据库优化方法,千万级数据库记录查询轻松解决(转载)

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  4. 50多条mysql数据库优化建议

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 缺省情况下建立的索引是非群集索引,但有时它并不是最佳的.在非群集索引下,数据在物理上随机存 ...

  5. 解开发者之痛:中国移动MySQL数据库优化最佳实践(转)

    开源数据库MySQL比较容易碰到性能瓶颈,为此经常需要对MySQL数据库进行优化,而MySQL数据库优化需要运维DBA与相关开发共同参与,其中MySQL参数及服务器配置优化主要由运维DBA完成,开发则 ...

  6. 30多条mysql数据库优化方法【转】

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  7. 百万行mysql数据库优化和10G大文件上传方案

    百万行mysql数据库优化和10G大文件上传方案 最近这几天正在忙这个优化的方案,一直没时间耍,忙碌了一段时间终于还是拿下了这个项目?项目中不要每次都把程序上的问题,让mysql数据库来承担,它只是个 ...

  8. mySQl数据库的学习笔记

    mySQl数据库的学习笔记... ------------------ Dos命令--先在记事本中写.然后再粘贴到Dos中去 -------------------------------- mySQ ...

  9. Mysql数据库基础学习笔记

    Mysql数据库基础学习笔记 1.mysql查看当前登录的账户名以及数据库 一.单表查询 1.创建数据库yuzly,创建表fruits 创建表 ) ) ,) NOT NULL,PRIMARY KEY( ...

随机推荐

  1. 【HDOJ6609】Find the answer(线段树)

    题意:给定一个n个正整数的数列,第i项为w[i],对于每个i,你要从[1,i-1]中选择一些变成0,使得变化后[1,i]的总和小于m,每次询问最少要变几个 n<=2e5,m<=1e9,1& ...

  2. 2018-2019-2 20175223 实验四 《Android开发基础》实验报告

    目录 北京电子科技学院(BESTI)实验报告 实验名称:实验四 Android程序设计 实验内容.步骤与体会: 一.实验四 Android程序设计-1 二.实验四 Android程序设计-2 三.实验 ...

  3. outlook使用inline style回复邮件

    Reply with inline comments within the original message text When you reply to email messages in Outl ...

  4. 左手Mongodb右手Redis 第三章mongdb操作

    mongodb查询操作 1.查询操作 db.getCollection('example_data_1').find({})  查询所有的信息,相当于mysql中的select * from tabl ...

  5. fpm rpm制作

    使用fpm命令制作rpm包并安装 工作中有如下情况需要将文件打包rpm: 避免重复工作,将源码程序打包为rpm 使用yum发布项目,项目打包为rpm 将自己写好的程序打包为rpm,提供给用户下载 其他 ...

  6. USACO 5.4 章节

    Canada Tour 题目大意 双向连通图,点从左向右排列, 你需要先从最左的点到最右的点,(过程中只能从左向右走) 然后再从最右的点返回最左的点,(过程中只能从右向左走) 过程中除了最左的点,其它 ...

  7. 好1.1.4 PTA提交列表及说明

    这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 我在这个课程的目标是 这个作业在那个具体方面帮助我实现目标 概括本周的学习以及更加熟练本周的代码 参考文献 C语言程序设计 百度文献 (h ...

  8. .eslintrc.js相关配置

    module.exports = { root: true, //此项是用来指定javaScript语言类型和风格,sourceType用来指定js导入的方式,默认是script,此处设置为modul ...

  9. 2018前端面试总结,看完弄懂,工资少说加3K | 掘金技术征文

    2018前端面试总结,看完弄懂,工资少说加3K | 掘金技术征文:https://juejin.im/post/5b94d8965188255c5a0cdc02

  10. canvas时间粒子

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...