前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL大表优化方案

MySQL大表优化方案

作者头像
用户8639654
修改2021-08-23 18:35:35
1.1K0
修改2021-08-23 18:35:35
举报
文章被收录于专栏:云计算运维云计算运维

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】,建立前缀索引:
代码语言:javascript
复制
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分页,每页数量不要太多;

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 优化
    • 1、字段
      • 2、索引
        • 3、查询SQL
        相关产品与服务
        云数据库 MySQL
        腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档