核心规则
1.尽量不在数据库中做运算。
2.控制单表数据量:INT不超过1000W条,含CHAR不超过500W条。合理分表分库。
3.保持表的精简:字段数应少而精。
4.平衡范式与冗余:遵循三大范式。适当时也可以牺牲范式,增加冗余。
5.拒绝3B:Big SQL,Big Transaction,Big batch——大SQL,大事务,大批量。
字段类规则
1.用好数值字段类型。
2.将字符串转化为数字:毕竟数字占用空间更小更高效。
3.优先使用ENUM或SET。
4.避免使用NULL字段。难以优化,含NULL符合索引无效,NULL列加索引需要额外空间。
5.少用并拆分TEXT/BLOB。强制生成硬盘临时表、浪费空间,性能远不如VARCHAR(65535,UTF-8)。如果必须用,那就拆分到单独的表。
6.不在数据库中存储图片。
索引类规则
1.索引并非越多越好,请谨慎合理添加。
2.字符字段必须建前缀索引,例如name varchar(100),那么索引就是idx_name(name(8))这样。
3.不在索引列做运算,否则导致无法使用索引,进而导致全表扫描。
4.自增列或全局ID做INNODB主键。
5.尽量不使用外键。
SQL类规则
1.SQL语句尽可能简单。一条SQL只能在一个CPU上运行,高并发环境下,一条1秒钟的大SQL意味着数据库打出GG。因此,大SQL要尽可能拆分。这样可以用到多CPU优势、可以提高缓存命中、减少锁表时间。
2.保持事务(链接)短小。事务无关的操作放到事务外,如果不影响整体一致性,那么就将事务拆分。
3.尽量少用存储过程(SP)、触发器(TRIG)、函数(FUNC)对结果进行处理。
4.避免使用SELECT *。因为占用带宽、内存、IO,只去所需的列。
5.改写OR为IN()。
6.改写OR为UNION。
7.避免负向查询和%的前缀模糊查询。
8.不用count(*)。
9.LIMIT高效分页。
10.若无需对结果进行去重,则用UNION ALL代替UNION。去重有开销。
11.分解联接保证高并发,最好不要超过两个表来JOIN。
12.GROUP BY去除排序。
13.同数值类型字段才能相互比较。