通过上述3个参数,收集慢查询日志,通过写脚本 ,mysqladmin 进行日志切割,在使用msyqlsla工具进行分析,然后每天8点 通过定时任务去执行,定期将结果以邮件方式,发送给公司的DBA,或自己,核心开发,抄送CTO
二、我们抓到慢查询了,如何进行优化?
创建索引
explian命令 # 查看sql语句使用索引情况
SQL-no-cache \G, #看看SQL语句 是不是走索引
注意其中有个key,真正显示是否走索引的,如果没有走索引的话,就要进行设置,那如何设置呢???
例如,我们查询当前系统所有用户,这个查询语句启用的是PRIMARY 主��索引(看key)
mysql> explain select user,host from mysql.user \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: user
type: index
possible_keys: NULL
key: PRIMARY
key_len: 228
ref: NULL
rows: 6
Extra: Using index
1 row in set (0.00 sec)
查看表结构(RPI主键索引)
mysql> desc mysql.user;
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Host | char(60) | NO | PRI | | |
| User | char(16) | NO | PRI | | |
三、如何创建索引?
我们可以针对 where 后 的条件 这种列做索引,尽量选唯一值多的大表上的列做索引,(例如男女性别列唯一值少,不是适合建立索引),如果条件列有好几列,唯一值有很少,我们可以建立联合索引来达到优化目的, 联合索引有前缀特性,查询频繁的列要放在前面,细节就不在说了,确认如何建立索引后,我们就开始创建索引
1,创建索引有2 种方法:
alter table student change id id int primary key auto_increment; #增加自增主键索引
alter table student add index index_name(name) #增加普通索引
create index index_dept on student(dept(8)); #创建指定字符数索引
数据量特别大的情况下,我们尽量选择数据库处于低谷或 选择晚上进行,以免影响站点访问,紧急情况除外;
四、更高级的优化
还可以使用select profile功能 ,对SQL语句的每一个细节,查看进行优化,这里我使用也不是很多,一般是公司专业DBA来进行处理。
当然也会遇到特别的长的sql语句,优化的余力也不大,我会sql语句发给核心开发,进行处理,比如1条语句很慢,我可以变为2条,分别走索引,有可能有会很高,也可以用过改善产品,改善架构的方式,例如这条语句没有优化的余地,我们可以放到内部的从库上进行查询;