MySQL数据库优化笔记

看到此文,是否觉得体内洪荒之力爆发,饥渴难耐想吐槽、情不自禁想捐赠
本文为原创文章,尊重辛勤劳动,可以免费摘要、推荐或聚合,亦可完整转载,但完整转载需要标明原出处,违者必究。

支付宝微  信

mysql-logo

视频地址: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数据库优化笔记

转载请注明出处,违者必究!

 

 


这是一篇原创文章,如果您觉得有价值,可以通过捐赠来支持我的创作~
捐赠者会展示在博客的某个页面,钱将会用在有价值的地方,思考中...


分类: MySQL, 技术, 随记 | 标签: , , | 评论 | Permalink

发表评论

电子邮件地址不会被公开。 必填项已用*标注