1、范式的理解https://www.cnblogs.com/ktao/p/7775100.html
2、核心的规则
-
尽量不在数据库做运算 md5() / Order by Rand()
-
控制单表数据量
一年内的单表数据量预估
纯INT不超1000W
含CHAR不超500W
• 合理分表不超载
USERID
DATE
AREA -
保持表身段苗条
表字段数少而精
√ IO高效 √全表遍历 √表修复快
√提高幵发 √alter table快
• 单表多少字段合适?
• 单表1G体积 500W行评估
顺序读1G文件需N秒
单行丌赸过200Byte
单表丌赸50个纯INT字段
单表丌赸20个CHAR(10)字段
• 单表字段数上限控制在20~50个 -
平衡是门艺术
效率优先、提升性能,适当时牺牲范式、加入冗余 -
拒绝3B
大SQL (BIG SQL)
大事务 (BIG Transaction)
大批量 (BIG Batch)
3、字段类型规则
- 用好数值字段类型
根据实际情况选择相应的字段类型 - 将字符转化为数字
如果是可以使用数字优先使用数字字段
更高效 查询更快 占用空间 - 优先使用枚举ENUM/SET (字符串 可能值已知且有限)
sex
enum(‘F’,‘M’) COMMENT ‘性别’ - 避免使用NULL字段
很难进行查询优化
NULL列加索引,需要额外空间
含NULL复合索引无效
c
int(10) NOT NULL DEFAULT 0 - 少用幵拆分TEXT/BLOB
TEXT类型处理性能远低亍VARCHAR
若必须使用则拆分到单独的表 - 不在数据库存图片
4、索引类规则
-
谨慎添加索引
改善查询
减慢更新
索引不是越多越好 -
能不加索引尽量不加索引
最好不超字段的20% -
不在索引列作运算
-
尽量不使用外键,用程序控制外键关系
5、sql规则
-
SQL语句尽可能简单
拒绝大SQL,拆解成多条简单SQL -
保持事务(连接)短小
事务/连接使用原则:即开即用,用完即关
不事务无关操作放到事务外面, 减少锁资源的占用
丌破坏一致性前提下,使用多个短事务代替长事务 -
尽可能避免使用SP/TRIG/FUNC
尽可能少用存储过程
尽可能少用触发器
减用使用MySQL凼数对结果进行处理 -
尽量不用 SELECT * from table
-
改写OR语句
同一字段,将or改写为in()
OR效率:O(n) •
IN 效率:O(Log n)
当n很大时,OR会慢很多
注意控制IN的个数,建议n小亍200
不同字段改写OR为UNION -
避免负向查询和% 前缀模糊查询
避免负向查询 NOT、!=、<>、!<、!>、NOT EXISTS、NOT IN、 NOT LIKE等
避免 % 前缀模糊查询 B+ Tree 使用丌了索引 导致全表扫描 -
减少COUNT(*) • LIMIT的高效分页
-
• 用UNION ALL 而非 UNION
若无需对结果进行去重,则用UNION ALL UNION有去重开销 -
• 分解联接保证高幵发
减少连表 -
• GROUP BY 去除排序
特定排序:Group by DESC/ASC -
• 同数据类型的列值比较
字段:remark
varchar(50) NOT NULL COMMENT ‘备注, 默认为空’,
MySQL>SELECTid
,gift_code
FROM gift WHEREdeal_id
= 640 AND remark=115127; 1 row in set (0.14 sec)
MySQL>SELECTid
,gift_code
FROM pool_gift WHEREdeal_id
= 640 AND remark=‘115127’; 1 row in set (0.005 sec) -
Load data导数据
批量数据快导入: 成批装载比单行装载更快,丌需要每次刷新缓存 无索引时装载比索引装载更快 Insert values ,values,values 减少索引刷新 Load data比insert快约20倍
• 尽量丌用 INSERT … SELECT 延迟 同步出错 -
打散大批量更新
• 大批量更新凌晨操作,避开高峰
• 凌晨丌限制 • 白天上限默认为100条/秒(特殊再议)