mysql性能调优的思路:
对mysql优化时是 一个综合性的技术,主要包括:
- 表的设计合理(符合3NF)
- 添加适当索引【四种:普通索引、主键索引、唯一索引、全文索引】
- 分表技术(水平分割,垂直分割)
- 读写分离
- 存储过程【模块化编程,可以提高速度】
- 对mysql配置优化[my.ini max_connection最大并发数(一般网站调整到1000左右)]
- mysql 服务器硬件的升级
- 定期清除不需要的数据,定时进行碎片整理(MyISAM)
问题: 如果一台服务器出现长时间负载过高/周期性负载过大,或偶尔卡住,如何来处理?
答: 大的思路:是周期性的变化还是偶尔问题? 是服务器整体性能的问题,还是某单条语句的问题?
具体到单条语句,这条语句 是在等待上花的时间,还是在查询上花的时间。
唯一的办法----监测并观察服务器的状态
1. 观察服务器状态,一般用如下2个命令
show status; show processlist
不规则的延迟现象往往是由于效率低下的语句造成的,如何抓到这些效率低的语句。
show processlist;
这个命令时显示当前所有连接的工作状态;
#!/bin/bash while true do mysql -uroot -e 'show processlist\G'|grep State:|uniq -c|sort -rn echo '---' sleep 1 Done
如果观察到以下状态,则需要注意:
converting HEAP to myISAM | 查询结果太大时,把结果放在磁盘(语句写的不好,取数据太多) |
create tmp table | 创建临时表(如group 时储存中间结果),说明索引建的不好 |
Copying to tmp table on disk | 把内存临时表复制到磁盘(索引不好,表字段选的不好) |
locked | 被其他查询锁住(一般在使用事务时,互联网应用补偿发生) |
logging slow query | 记录慢查询 |
如何定位到有问题的语句:
1. 开启服务器慢查询
2.找到慢查询的语句,使用服务器show profiles 观察语句的执行步骤
3.了解临时表的使用规则
4.经验