MySQL性能优化
一、数据库优化目的
1)避免出现页面访问错误
2)增加数据库的稳定性
3)优化用户体验
二、使用MySQL慢查询日志对有效率问题的SQL进行监控
1)show variables like 'slow_query_log'(或者使用show variables like '%log%')
2)set global slow_query_log_file='/home/mysql/sql_log/mysql-slow.log'(设置存储路径)
3)set global log_queries_not_using_indexes=on;(记录没有使用索引的sql)
4)set global long_query_time=1(记录大于一秒的日志存在于文件中)
三、SQL语句优化
1)使用关键字explain查询SQL的执行计划
2)函数max()和count()优化方案,在其函数使用字段上添加索引。注count(*)和count(column)结果不一定相同,前者统计包含NULL值,后者则不包含。
3)子查询优化方案,需要把子查询优化为join查询,但在优化时要注意关联键是否有一对多关系,防止数据重复。
4)group by优化方案,需要在子查询里过滤条件,避免使用临时表和文件排序,提高效率。
5)limit优化方案
优化步骤一:使用有索引的列或者主键进行order by操作
优化步骤二:记录上次返回的主键,在下次查询室使用主键过滤
四、索引优化
1)离散度更高的列,在建立联合索引时,放在联合索引的前面,如一张表中两个字段id,distinct值越大,则放在前面,反之则放在后面。
2)重复及冗余索引,如主键同时也是唯一键,在建立索引时,就重复了;如主键在联合索引字段里,创建索引则冗余了。
3)删除不用索引。
五、表结构的优化
1)选择合适的数据类型
1、使用可以存下数据最小的数据类型
2、使用简单的数据类型,int比varchar类型在MySQL处理上简单
3、尽可能使用not null定义字段
4、尽量少用text类型,非用不可时最好考虑分表
2)范式化优化,如(商品名称)->(分类)->(分类描述)
3)反范式化优化
3)表的垂直拆分
1、把不常用的字段单独存放到一个表中
2、把大字段独立存放到一个表中
3、把经常一起使用的字段放到一起
3)表的水平拆分
1、对customer_id进行hash/range运算,如果要拆分成五个表则使用mod(customer_id,5)取出0-4个值
2、针对不同的hashID把数据存放到不同的表中
五、系统配置优化