MySQL大表优化方案

作者: Muscleape | 来源:发表于2020-03-26 12:38 被阅读0次

    MySQL慢查询日志

    下面优化方案参考原文地址

    1、尽量不要在一开始就考虑表拆分,会带来逻辑、部署、运维的各种复杂度;
    2、一般以整型值为主的表在千万级以下,字符串为主的表在五百万以下问题不大;

    注意:
    1、Covering index:索引覆盖:即当索引本身包含查询所需全部数据时,不再访问数据文件本身,也就是不再需要回表操作;
    2、复合索引顺序:理论上索引对顺序是敏感的,但是由于MySQL的查询优化器会自动调整where子句的条件顺序以使用适合的索引

    优化

    1、字段

    • 尽量使用TINYINT、SMALLINT、MEDIUMINT作为整数类型,而非INT类型,如果非负加上UNSIGNED
    • VARCHAR的长度只分配真正需要的空间;
    • 使用枚举或整型代替字符串类型;
    • 尽量使用TIMESTAMP而非DATETIME
    • 单表不要有太多字段,建议在20以内;
    • 避免使用NULL字段,很难查询优化且占用额外索引空间;
    • 用整型来存IP;

    2、索引

    • 索引不是越多越好,要根据查询有针对性的创建,考虑在WHEREORDER BY涉及到的列建索引,可以根据EXPLAIN来查看是否用了索引还是全表扫描;
    • 避免在WHERE子句中对字段进行NULL值判断,否则将导致全表扫描;
    • 值分布稀少的字段不适合建立索引,如“性别”的这种;
    • 字符字段只建立前缀索引【注意:不能用于ORDER BY和GROUP BY操作,也不能用于Covering index】,建立前缀索引:
    ALTER TABLE TEST ADD INDEX `last_name4` (last_name(4));
    
    • 字符字段最后不要做主键;
    • 不用外键,由程序保证约束;
    • 尽量不用UNIQUE,由程序保证约束;
    • 使用多列索引时,注意顺序和查询条件一致,同时删除不必要的单利索引;

    3、查询SQL

    • 可通过开启慢查询日志来找到比较慢的SQL;
    • 不做列运算,列运算将导致全表扫描;
    • SQL语句尽可能简单:
      -- a、一条SQL只能在一个CPU运算;
      -- b、大语句拆小语句,减少锁时间;
      -- c、一条大SQL可以堵死整个库;
    • 不用 SELECT * ;
    • OR 改写成 IN:OR的效率是n级别,IN的效率是log(n)级别,IN的个数建议控制在200以内;
    • 不用函数和触发器,在应用程序实现;
    • 避免后缀式(%xxx)查询;
    • 少用 JOIN ;
    • 使用同类型比较:'123'跟'123'比较,123跟123比较,数字跟数字比较,字符串跟字符串比较;
    • 对于连续值,使用BETWEEN,不用IN
    • 列表数据不要拿全表,要使用LIMIT分页,每页数量不要太多;

    相关文章

      网友评论

        本文标题:MySQL大表优化方案

        本文链接:https://www.haomeiwen.com/subject/qagtuhtx.html