mysql性能优化-简易版
mysql性能优化
sql语句优化
如何发现有问题的sql?
开启mysql慢查询
show variables like 'slow_query_log'
set global slow_query_log_file='/var/mysql/mysql_log/mysql-slow.log'
set global log_queries_not_using_index=on;
set global long_query_time=1
MySQL慢查日志分析工具之mysqldumpslow
mysqldumpslow 参数 日志文件路径
MySQL慢查日志分析工具之pt-query-digest
输出到文件:
pt-query-digest slow-log > slow_log.report
输出到数据库:
pt-query-digest slow-log -review h=127.0.0.1,D=test,p=root,P=3306,u=root,t=query_review --create-reviewtable --review-history t=hostname_slow
如何通过慢查日志发现有问题的SQL
查询次数多且每次耗时长的sql
通常为前几个查询sql
IO大的sql
pt-query-digest中Rows examine项
未命中索引的sql
注意pt-query-digest中Rows examine和Row Send的对比,Rows examine远远大于Row Send的sql。
通过explain查询和分析SQL的执行计划
explain sql语句
explain select id,username from student;
table:对应的表
type:最好到最差的连接类型const、eq_reg、ref(常见于连接查询中)、range、index和ALL(表扫描)
possible_keys:显示可能应用在这张表中的索引,如果为空,则表示没有可用的索引。
key:实际使用的索引,为空是表示没有用到索引
key_len:索引的长度。(越小越好)
ref:显示索引的哪一列被使用了,如果可能的话是一个常数。
rows:返回的行数
extra列返回值需要注意:
Using filesort:看到这个的话查询就需要优化了。
Using temporary:看到这个的话查询就需要优化了。一般会出现在group by和order by中。
Count()和Max()的优化
select max(pay_date) from order;
max:可以创建一个索引进行操作
count:
count(*)和count(id)的区别:*会统计所有行数,id只统计列不为NULL的行数
同时查出2015年和2016年电影的数量
select count(release_year='2016' OR NULL) as 2016电影数量',count(release_year='2015' OR NULL) as 2016电影数量' from film;
子查询的优化
通常情况下,一般将子查询优化为join的方式进行查询。但是优化时需要注意的是关联键是否存在一对多的关系,要注意重复数据
如果优化成join的方式出现数据重复句,可以使用distinct的方式进行去重处理。
group by的优化
优化前的写法:
eplain select actor.first_name, actor.last_name, c.cnt from sakila.actor inner join sakila.film_actor using(actor_id) group by file_actor.actor_id;
extra:using temporary; using filesort
group by 优化后的写法:
eplain select actor.first_name, actor.last_name, c.cnt from sakila.actor inner join ( select actor_id, count(*) as cnt from sakila.film_actor group by actor_id ) as c using(actor_id);
extra:using index
这样可以减少io等。
Limit查询的优化
limit常用于分页处理,同时会伴随order by从句的使用。因此在大多时候会使用filesort的方式进行,从而导致大量的IO
explain select id, name, sex from student order by name;
extra:using filesort
优化步骤1:使用索引键或者主键进行order by排序
explain select id, name, sex from student order by id limit 10, 5;
优化步骤2:使用过滤条件(避免数据量过大时扫描记录数过多的情况)
explain select id, name, sex from student where id > 10000 and id < 100005 order by id limit 1, 5;
索引优化
如何选择合适的列建立索引
1、where从句、order by从句、group by从句、on从句出现的列
2、索引字段越小越好
3、离散度(唯一值越多离散度越大)大的列放在联合索引的前面
索引优化SQL的方法
重复索引,如主键为id,又声明了unique(id)的索引
冗余索引,索引里面包好了主键。由于innodb中默认索引都包含了主键,因此没有必要在索引里面再次包含索引。
使用pt-duplicate-key-checker工具进行重复及冗余索引的检查
pt-duplicate-key-checker -uroot -ppassword -h 127.0.0.1
索引维护的方法
对于已经不再使用的索引进行删除
pt-index-usage -uroot -p'password' mysql-slow.log
数据库结构优化
选择合适的数据类型
1、使用可以存下数据的最小数据类型
2、使用简单的数据类型。int要比varchar处理上简单
3、尽可能使用not null属性
4、尽量少用text类型,非用不可时可以考虑分表
用int来存储日期时间,使用FROM_UNIXTIME和UNIX_TIMESTAMP进行转换。
使用bigint来存储IP地址,inet_aton(),inet_ntoa()来进行转换。
表的范式化优化
表的反范式化优化
以空间换取时间的方式
如果完全按照三范式的设计会导致关联表过多等一系列问题。
表的垂直拆分
解决表字段过多的问题
拆分原则:
- 把不常用的字段放在一个表中
- 把大字段独立放在一个表中
- 把经常使用的字段放在一起
表的水平拆分
解决表数据量的问题,拆分后表结构是一样的。
存在问题:跨分区表查询、统计及后台报表操作
系统优化
数据库系统配置优化
参考:http://www.cnblogs.com/rwxwsblog/p/5785376.html
MySQL配置文件优化
参考:http://www.cnblogs.com/rwxwsblog/p/5792962.html
第三方配置工具使用
Percon Configuration Wizard
https://tools.percona.com/wizard
服务器硬件优化
参考:http://www.cnblogs.com/rwxwsblog/p/5785376.html
mysql性能优化-简易版的更多相关文章
- redmine在linux上的mysql性能优化方法与问题排查方案
iredmine的linux服务器mysql性能优化方法与问题排查方案 问题定位: 客户端工具: 1. 浏览器inspect-tool的network timing工具分析 2. 浏览 ...
- Mysql - 性能优化之子查询
记得在做项目的时候, 听到过一句话, 尽量不要使用子查询, 那么这一篇就来看一下, 这句话是否是正确的. 那在这之前, 需要介绍一些概念性东西和mysql对语句的大致处理. 当Mysql Server ...
- Mysql性能优化三(分表、增量备份、还原)
接上篇Mysql性能优化二 对表进行水平划分 如果一个表的记录数太多了,比如上千万条,而且需要经常检索,那么我们就有必要化整为零了.如果我拆成100个表,那么每个表只有10万条记录.当然这需要数据在逻 ...
- [MySQL性能优化系列]提高缓存命中率
1. 背景 通常情况下,能用一条sql语句完成的查询,我们尽量不用多次查询完成.因为,查询次数越多,通信开销越大.但是,分多次查询,有可能提高缓存命中率.到底使用一个复合查询还是多个独立查询,需要根据 ...
- [MySQL性能优化系列]巧用索引
1. 普通青年的索引使用方式 假设我们有一个用户表 tb_user,内容如下: name age sex jack 22 男 rose 21 女 tom 20 男 ... ... ... 执行SQL语 ...
- MySQL性能优化:索引
MySQL性能优化:索引 索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序.数据库使用索引以找到特定值,然后顺指针找到包含该值的行.这样可以使对应于表的SQL语句执 ...
- mysql 性能优化方向
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- MySQL性能优化总结
一.MySQL的主要适用场景 1.Web网站系统 2.日志记录系统 3.数据仓库系统 4.嵌入式系统 二.MySQL架构图: 三.MySQL存储引擎概述 1)MyISAM存储引擎 MyISAM存储引擎 ...
- MYSQL性能优化的最佳20+条经验
MYSQL性能优化的最佳20+条经验 2009年11月27日 陈皓 评论 148 条评论 131,702 人阅读 今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数 ...
随机推荐
- 解决DWZ(JUI)的panel 点击关闭或者打开按钮 自己写的标签消失
问题描述:DWZ的panel面板比较常用,我们常常需要在其标题栏上再增加一个些按钮,如下图问题出来了,增加按钮后,点面板收缩按钮,增加的按钮就消失了而且面板收缩的click事件,也跟新增的按钮绑定了, ...
- dijkstra算法求最短路
艾兹格·W·迪科斯彻 (Edsger Wybe Dijkstra,1930年5月11日~2002年8月6日)荷兰人. 计算机科学家,毕业就职于荷兰Leiden大学,早年钻研物理及数学,而后转为计算学. ...
- java常用类 --- Object
Object类 Object类是所有Java类的父类,其位于java.lang包中.任何Java对象,如果没有显示定义父类则它默认Object类作为父类. 方法如下: 其中与线程相关的有5个方法: n ...
- systemd
本文参照:https://wiki.archlinux.org/index.php/Systemd#Basic_systemctl_usage 做了翻译和整理 systemd是Linux下的一种ini ...
- php加速运行优化
一个系统的运行性能,除了程序本身要写的完善,还有要看php本身的一些问题,对于php的运行优化,主要有这些加速器:wincache,xcache,ZendOPcache,eAccelerator加速器 ...
- 微信电脑版真的要来了 微信Windows版客户端1.0 Alpha推出
微信电脑版的搜索量一直很大,但只有网页版,之前也写了微信网页版APP - 网页微信客户端电脑版体验,在键盘上打字的感觉就是快.现在微信Windows版客户端1.0 Alpha推出了,来一睹芳容吧(20 ...
- 【C语言入门教程】4.5 指针变量的定义与引用
指针变量是包含内存地址的变量.一般的变量直接包含一个特定的值,而指针变量包含的是某一特定数据类型的内存地址.普通变量直接引用其中的值,指针变量则间接引用所指向内存地址中的值.指针变量在使用前需要声明与 ...
- ORACLE连接字符串里每个参数的具体意思
1.数据库名(db_name):数据库名是存储在控制文件中的数据库的名称.它代表的是数据库也就是所有构成数据库的物理文件的总称.要修改这个名称,只要重建控制文件就行了.2.实例名:实例名指的是用于响应 ...
- python入门基础代码
#查找index函数的帮助 help(str.index) #for循环和break语句from math import sqrtfor i in range(2,101): flag=1 k=int ...
- C++ STL,list vector区别
顺序性容器: 向量 vector : 是一个线性顺序结构.相当于数组,但其大小可以不预先指定,并且自动扩展.它可以像数组一样被操作,由于它的特性我们完全可以将vector 看作动态数组.在创建一个 ...