1.表中所有字段必须都是NOT NULL属性,业务可以根据需要定义DEFAULT值。
a)null的列MySQL内部需要更多的特殊处理,消耗更多资源;
b)对null 的处理时候,只能采用is null或is not null,而不能采用=、in、<、<>、!=、not in这些操作符号。如:where status!=1,查询结果不会包含status为null值的记录,另外:负向查询条件:、!=、NOT IN、NOT LIKE等,会导致全表扫描,避免使用
2.避免使用blob、text等大字段,如果必须使用,应垂直拆分到分表,扩展表里,仅在需要读这些对象的时候才去select。
3.时间类型尽量选取timestamp,datetime占用8字节,timestamp仅占用4字节,但是范围为1970-01-01 00:00:01到2038-01-01 00:00:00。也可选用int来存储时间,使用SQL函数unix_timestamp()和from_unixtime()来进行转换,但可读性差。
4.存储金钱的字段,建议用int,程序端乘以100和除以100进行存取。
因为int占用4字节,而double占用8字节,空间浪费,且小数容易导致钱对不上.
5.水平分表尽量用取模方式,日志、报表类数据建议采用日期进行分表。
6.数据库本身库、表、列所有字符集必须保持一致,为utf8或utf8mb4,否则容易索引失效。建议mysql服务端my.cnf做默认配置
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
7.禁止使用存储过程、视图、触发器、Event,禁止超过3-5张表的join。
解读:高并发大数据的互联网业务,架构设计思路是“解放数据库CPU,将计算转移到服务层”,并发量大的情况下,这些功能很可能将数据库拖死,业务逻辑放到服务层具备更好的扩展性,能够轻易实现“增机器就加性能”。过多的join可能较多的nested loop,消耗较多CPU
8.用INT存储IP,节省存储空间,SQL提供有的两个IP转换函数:select inet_aton('192.168.148.128'); select inet_ntoa(3232236044);