MySQL性能优化

2020-08-09  本文已影响0人  Liuzhoulin

一、数据库优化目的

    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把数据存放到不同的表中

五、系统配置优化

    

上一篇下一篇

猜你喜欢

热点阅读