视频地址:http://www.imooc.com/video/3688
可以从以下几个方面进行优化
- 硬件
- 系统配置
- 数据表结构
- SQL语句和索引
一般来说,上述方式的实现成本(自上而下)由高到低,而效果(自上而下)由低到高。
使用慢查询日志
使用系统的慢查询日子来监控有问题的SQL。
- show variables like ‘slow_query_log’
- set global slow_query_log_file = ‘/home/mysql/log/slow_query_log.log’
- set global log_queries_no_using_indexes = on
- set global long_query_time = 1
慢查询分析工具
- pt-query-digest
如何发现有问题的SQL
- 查询次数多,且占用时间长的(通常为pt-query-digest分析中前几个SQL);
- IO大得SQL(注意pt-query-digest中row examine项);
- 未命中索引的SQL(注意pt-query-digest中row examine和row send的对比)。
如何分析SQL查询
- 使用explain命令分析SQL的执行计划
explain返回列的含义
- table 显示这一行的数据是关于哪个表的;
- type 显示连接使用了何种类型。从最好到最差的连接类型为:const、eq_reg、ref、range、index和ALL;
- possible_keys 显示可能应用在这张表中的索引。如果为空,没有可能的索引;
- key 实际所用的索引。如果为空,则没有使用索引;
- key_en 使用索引的长度。在不损失精确性的情况下,长度越短越好;
- ref 显示索引的哪一列被使用了。如果可能的话,是一个常数;
- rows MySQL认为必须检查的用来返回请求数据的行数;
- extra 列需要注意的返回值:using filesort ;using temporary。
如何选择合适的列建立索引
- 在where从句、order by从句、group by从句和on从句中出现的列;
- 索引字段越小越好;
- 离散度大的列放在复合索引的前列。
当使用复合索引时,建议将离散度高(唯一值多)的列放在复合索引的前者。
索引优化
- 去除重复索引;
- 去除冗余索引;
- 去除无用索引。
数据库结构优化
- 选择合适的数据类型
- 使用相对较小的数据类型
- 使用简单的数据类型
- 尽可能使用NOT NULL定义字段
- 尽可能少使用text类型,非用不可时可以考虑分表
- 表的范式优化
- 第三范式:数据表中不存在非关键字段对任意候选关键字段的传递函数依赖
- 表的反范式化优化
- 表的垂直拆分
- 不常用的字段放在一个表中
- 常用的字段放在一个表中
- 把大字段放在一个表中
- 表的水平拆分
文章来源:胡旭个人博客 => 【原】MySQL数据库优化笔记
转载请注明出处,违者必究!