mysql数据库优化 SQL语句优化

Mysql数据库优化——sql语句优化
参考:http://www.imooc.com/learn/194mysql

学些慕课网视屏总结
sql


1、如何发现有问题的sql?
一、使用mysql慢查询日志对有效率问题的sql进行监控

//查看是否开启慢查询日志
show variables like 'slow_query_log'数据库

wKiom1cIi-LjBzUoAAAsFHJ28Wo191.png

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

wKioL1cIjEWCXAllAABi5sosyvE046.png

二、慢查询日志分析工具
mysqldumpslow:直接同mysql数据库一同安装

//查询下相关使用参数

mysqldump -h

wKiom1cI9EXQcyTOAACyhV5X_mU212.png

//直接分些下慢查询日志

mysqldumpslow -t 3 /var/lib/mysql/mysql-slow.log

wKioL1cI9Z3TsiQfAAEYMnTjA4w321.png


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:工具能够查看数据库中多余的索引

相关文章
相关标签/搜索