• 目的
    避免出现页面访问错误
    慢查询造成页面无法加载
    阻塞造成数据无法提交
    优化从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. basic play

    [root@wen ~]# w 19:01:27 up 1 day, 7:06, 3 users, load average: 0.00, 0.00, 0.00 USER TTY FROM LOGIN ...

  2. paper 154:姿态估计(Hand Pose Estimation)相关总结

    Awesome Works  !!!! Table of Contents Conference Papers 2017 ICCV 2017 CVPR 2017 Others 2016 ECCV 20 ...

  3. window安装oracle和创建数据库

    原文地址: https://www.cnblogs.com/hoobey/p/6010804.html  #11g安装 https://www.cnblogs.com/qq1272850043/p/6 ...

  4. 使用xorm将结构体转为sql文件

    操作步骤 (1)定义结构体 type User struct { Id int //表id Name string //姓名 ...}12345(2)编写代码,执行自动增量同步(mysql为例) im ...

  5. 颁发不受浏览器信任的SSL证书

    xshell登录服务器,使用openssl生成RSA密钥及证书 # 生成一个RSA密钥 $ openssl genrsa -des3 -out tfjybj.key 1024 # 生成一个证书请求$ ...

  6. error MSB8008: 指定的平台工具集(v110)未安装或无效

    转自VC错误:http://www.vcerror.com/?p=318 问题描述: 平台工具集(v110)是vs2012下用的,你是用vs2010打开工程,它默认是用v100, 所以这个工程可能用v ...

  7. C#关于日期 月 天数 和一年有多少周及根据某年某周获取时间段的计算(转)

    /// 当前月有多少天 /// </summary> /// <param name="y"></param> /// <param na ...

  8. 在Windows及Linux下获取毫秒级运行时间的方法

    在Windows下获取毫秒级运行时间的方法 头文件:<Windows.h> 函数原型: /*获取时钟频率,保存在结构LARGE_INTEGER中***/ WINBASEAPI BOOL W ...

  9. 算法中时间复杂度概括——o(1)、o(n)、o(logn)、o(nlogn)

    在描述算法复杂度时,经常用到 o(1), o(n), o(logn), o(nlogn) 来表示对应算法的时间复杂度, 这里进行归纳一下它们代表的含义:这是算法的时空复杂度的表示.不仅仅用于表示时间复 ...

  10. GET和POST的数据传递到底有何区别?

    1. GET和POST与数据如何传递没有关系 GET和POST是由HTTP协议定义的.在HTTP协议中,Method和Data(URL, Body, Header)是正交的两个概念,也就是说,使用哪个 ...