Mysql数据库优化——sql语句优化
参考:http://www.imooc.com/learn/194mysql
学些慕课网视屏总结
sql
1、如何发现有问题的sql?
一、使用mysql慢查询日志对有效率问题的sql进行监控
//查看是否开启慢查询日志
show variables like 'slow_query_log'数据库
set global slow_query_log =on;//开启慢查询vim
//设置保存慢查询日志路径
set global slow_query_log_file = '/var/lib/mysql/slow_log.log';微信
//记录下没有使用索引的query,
show variables like 'log_queries_not_using_indexes' //先查看是否开启
set global log_queries_not_using_indexes = on;
ide
//设置sql执行时间
show variables like 'long_query_time';
set global long_query_time =1; //有点bug(修改了,在当前会话查询发现好像没有修改同样,不过退出后再登陆mysql发现已经修改了)工具
以上设置了慢查询经常使用参数测试
接下来测试一下优化
运行一条sql语句
spa
select sleep(5);
vim /var/lib/mysql/slow-low.log
二、慢查询日志分析工具
mysqldumpslow:直接同mysql数据库一同安装
//查询下相关使用参数
mysqldump -h
//直接分些下慢查询日志
mysqldumpslow -t 3 /var/lib/mysql/mysql-slow.log
pt_query_digest
三、如歌经过慢查询日志发现有问题的sql?
(1)查询次数多且每次查询占用时间长的sql
(2)IO大的sql
(3)未命中索引的sql
2、使用explain查询SQL的执行计划
explain返回各列的含义
table:显示这一行的数据是关于哪张表的;
type:显示链接使用了何种类型;从最好到最差的链接类型为const、eq_reg、ref、range、index、all
possible_keys:显示可能应用在这种表的索引;若是为空,没有可能的索引;
key:实际使用的索引,若是为NULL,则没有使用索引;
key_len:使用索引的长度,在不损失精确性的状况下,长度越短越好;
ref:显示索引的哪一列被使用了,若是可能的话,是一个常数
rows:mysql认为必须检查的用来返回请求数据的行数
extra:using filesort(mysql须要进行格外的步骤来发现如何对返回的行排序)/using temporary(mysql建立一个临时表来存储结果)(看到这两个的时候语句就须要优化了)
3、索引优化
如何选择合适的列创建索引?
一、在where从句,group by从句,order by 从句,on从句中出现的列
二、索引字段越小越好
三、离散度大的列放到联合索引的前面
离散度:一列值重复度的大小
覆盖索引:一个索引包含了查询的全部列称为覆盖索引
索引的维护及优化---重复及冗余索引
重复索引:指相同的列一相同的顺序创建的同类型索引;例如一张表的主键又创建unique()惟一性索引就属于重复索引
冗余索引:指多个索引的前缀列相同,或是在联合索引中包含了主键索引
pt-duplicate-key-checker:工具能够查看数据库中多余的索引