`

mysql性能优化

 
阅读更多

引起慢查询的原因:
1.向数据库请求了不需要的数据
2.mysql是否在扫描额外的记录

优化步骤:
1.开启慢查询日志,找出慢SQL语句
2.通过explain查询和分析查询计划

一、SQL语句优化

具体优化:
Count,关联查询,group by,limit

count:
统计列时不统计NULL,count(*)统计行数;
count需要扫描大量的行才能获得精确结果,mysql层面只有索引覆盖扫描。如果不够,需要修改架构,也可以添加汇总表或memcached这样的缓存系统。“快速,精确和简单”。三者只能满足其二

关联查询:
从子查询到关联查询需要用distinct去重;
确保on,或者using字句有索引。当A表和B表用列C关联是,如果优化器的关联顺序是B、A,不需要再B表对应的列建立索引,没有用到的索引只会带来额外的负担。只需要在A表建立索引

group by:
group by后面字段没有索引,mysql会创建临时表和重排序,如果不希望排序,可以使用order by null

limit:
当一个数据库表过于庞大,LIMIT offset, length中的offset值过大,则SQL查询语句会非常缓慢,你需增加order by,并且order by字段需要建立索引;
查询根据确定的id返回记录
把limit偏移量限制低于某个数。。超过这个数等于没数据;

二、索引优化

建立合适的索引三原则
1:单行访问时很慢的。
2:按顺序访问范围数据是很快的。原因是顺序I/O不需要多次磁盘寻道;服务器也能够按需要的顺序读取数据,不需要额外的排序操作
3:索引覆盖的查询是很快的

维护索引和表:找到并修复损坏的表,维护准确的索引统计信息,减少碎片

三、数据库结构优化

选择合适的数据类型:
1、在可以正确存储数据的最小前提下存储最小的数据类型;
2、避免NULL,因为null列使索引,值比较更加复杂,还会使用更多的存储空间
3、数据库表范式和反范式设计
4、使用缓存表和汇总表

数据库表垂直和水平拆分:
垂直拆分:把原来一个很多列的表拆分成多个表,解决表宽度太宽的问题
拆分原则:
1、把不常用的字段放到一个表里
2、把大字段独立存到一个表里
3、把进程使用的字段存到一个表里

水平拆分:
解决单表数据量过大的问题,每个表结构完全一致
可以通过主键的hash算法,存储到不同的表中

系统配置和硬件优化:
本公司用的是阿里云RDS,已经优化好了


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics