MySQL SQL慢查询优化经历与处理方案(2)

通过上述3个参数,收集慢查询日志,通过写脚本 ,mysqladmin 进行日志切割,在使用msyqlsla工具进行分析,然后每天8点 通过定时任务去执行,定期将结果以邮件方式,发送给公司的DBA,或自己,核心开发,抄送CTO

msyqlsla工具地址

二、我们抓到慢查询了,如何进行优化?

创建索引

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条,分别走索引,有可能有会很高,也可以用过改善产品,改善架构的方式,例如这条语句没有优化的余地,我们可以放到内部的从库上进行查询;

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/4f41e34c93e722036edf17a122a3e773.html