mysql数据库优化学习
- 目的
避免出现页面访问错误
慢查询造成页面无法加载
阻塞造成数据无法提交
优化从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=1show 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 MBinnodb_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数据库优化学习的更多相关文章
- 关于MySQL数据库优化的部分整理
在之前我写过一篇关于这个方面的文章 <[原创]为什么使用数据索引能提高效率?(本文针对mysql进行概述)(更新)> 这次,主要侧重点讲下两种常用存储引擎. 我们一般从两个方面进行MySQ ...
- 【MySQL】花10分钟阅读下MySQL数据库优化总结
1.花10分钟阅读下MySQL数据库优化总结http://www.kuqin.com2.扩展阅读:数据库三范式http://www.cnblogs.com3.my.ini--->C:\Progr ...
- 30多条mysql数据库优化方法,千万级数据库记录查询轻松解决(转载)
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
- 50多条mysql数据库优化建议
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 缺省情况下建立的索引是非群集索引,但有时它并不是最佳的.在非群集索引下,数据在物理上随机存 ...
- 解开发者之痛:中国移动MySQL数据库优化最佳实践(转)
开源数据库MySQL比较容易碰到性能瓶颈,为此经常需要对MySQL数据库进行优化,而MySQL数据库优化需要运维DBA与相关开发共同参与,其中MySQL参数及服务器配置优化主要由运维DBA完成,开发则 ...
- 30多条mysql数据库优化方法【转】
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
- 百万行mysql数据库优化和10G大文件上传方案
百万行mysql数据库优化和10G大文件上传方案 最近这几天正在忙这个优化的方案,一直没时间耍,忙碌了一段时间终于还是拿下了这个项目?项目中不要每次都把程序上的问题,让mysql数据库来承担,它只是个 ...
- mySQl数据库的学习笔记
mySQl数据库的学习笔记... ------------------ Dos命令--先在记事本中写.然后再粘贴到Dos中去 -------------------------------- mySQ ...
- Mysql数据库基础学习笔记
Mysql数据库基础学习笔记 1.mysql查看当前登录的账户名以及数据库 一.单表查询 1.创建数据库yuzly,创建表fruits 创建表 ) ) ,) NOT NULL,PRIMARY KEY( ...
随机推荐
- 咱们从头到尾讲一次 Flink 网络流控和反压剖析
本文根据 Apache Flink 系列直播整理而成,由 Apache Flink Contributor.OPPO 大数据平台研发负责人张俊老师分享.主要内容如下: 网络流控的概念与背景 TCP的流 ...
- 从React Native到微服务,落地一个全栈解决方案
Poplar是一个社交主题的内容社区,但自身并不做社区,旨在提供可快速二次开发的开源基础套件.前端基于React Native与Redux构建,后端由Spring Boot.Dubbo.Zookeep ...
- 【CF1210D】Konrad and Company Evaluation(vector,图论)
题意:有i个人,m对两两之间的关系,第i个人初始的薪水为i,有q次操作,第i次操作会把v[i]号的薪水提升成n+i 如果两个人之间存在关系,薪水高的会向薪水低的炫耀 定义u,v,w为一个三元组,当u向 ...
- Windows Server服务器之Linux server与windows server的区别
Linux server与windows server的区别用linux做server,相对于windows server有什么优势? 首先,平均故障时间少,只要配置和使用得当,linux的平均故障( ...
- CodeForces 593D Happy Tree Party
题目链接: http://codeforces.com/problemset/problem/593/D ----------------------------------------------- ...
- VS中C语言scanf函数报错
在VS中创建C项目使用scanf方法时会如下报错 解决方案 方法1:文件中设置 在第一行设置代码 #define _CRT_SECURE_NO_WARNINGS 或者添加警告忽略 #pr ...
- Process Monitor监控进程操作注册表如何实现?
http://zhidao.baidu.com/link?url=Kqav4qkQSprC5FnpHPOGJvhqvY9fJ9-Vdx9g_SWh4w5VOusdRJo4Vl7qIdrG4LwRJvr ...
- Html5 学习笔记 【PC固定布局】 实战7 机票预订页面
最终实际效果: HTML代码: <!DOCTYPE html> <html lang="zh-cn"> <head> <meta char ...
- ATT&CK实战系列 红队实战(一)————环境搭建
首先感谢红日安全团队分享的靶机实战环境.红队实战系列,主要以真实企业环境为实例搭建一系列靶场,通过练习.视频教程.博客三位一体学习. 靶机下载地址:http://vulnstack.qiyuanxue ...
- undefined,null,var 0 = {},var s = '',的区别
undefined:不清楚变量的类型:var m; null:知道该变量是对象的引用,但是地址为空 var o = {};这是一个对象,有指向地址,但是值为空 var 0 = '';这是一个空的字符串