一、核心军规
1、尽量不在数据库做运算:例如md5() / Order by Rand()
2、控制单表数据量
3、保持表身段苗条
4、平衡范式不冗余
5、拒绝3B:大SQL (BIG SQL)、大事务 (BIG Transaction)、大批量 (BIG Batch)
二、字段类军规
1、用好数值字段类型
2、将字符转化为数字
3、优先使用ENUM或SET
4、避免使用NULL字段:很难进行查询优化;NULL列加索引,需要额外空间;含NULL复合索引无效
5、少用并拆分TEXT/BLOB:TEXT类型处理性能远低亍VARCHAR,强制生成硬盘临时表,浪费更多空间,VARCHAR(65535)==>64K (注意UTF-8);若必须使用则拆分到单独的表
6、不在数据库里存图片
三、索引类军规
1、谨慎合理添加索引
2、字符字段必须建前缀索引:字段名【name】,索引【idx_name】
3、不在索引列进行数学运算或凼数运算:无法使用索引;导致全表扫描
4、自增列或全局ID做INNODB主键:对主键建立聚簇索引;二级索引存储主键值;主键丌应更新修改;按自增顺序揑入值;忌用字符串做主键; 聚簇索引分裂;推荐用独立于业务的AUTO_INCREMENT列或全局ID生成器做代理主键;若不指定主键,InnoDB会用唯一且非空值索引代替
5、尽量不用外键
四、SQL类军规
1、SQL语句尽可能简单
2、保持事务(连接)短小
3、尽可能避免使用SP/TRIG/FUNC
4、尽量不用 SELECT *:更多消耗CPU、内存、IO、网络带宽
5、改写OR为IN()
6、改写OR为UNION
7、避免负向查询和% 前缀模糊查询
8、减少COUNT(*):COUNT(*)的资源开销大,尽量不用少用
9、limit偏移量越大越慢
10、用UNION ALL 而非 UNION:若无需对结果进行去重,则用UNION ALL,UNION有去重开销
11、Load data 导数据,批量数据快导入:成批装载比单行装载更快,不需要每次刷新缓存;无索引时装载比索引装载更快;Insert values ,values,values 减少索引刷新;Load data比insert快约20倍
五、约定类军规
1、统一字符集
2、统一命名规范:库表等名称统一用小写;索引命名默认为“idx_字段名”;库名用缩写,尽量在2~7个字母;注意避免用保留字命名