mysql数据库使用注意事项

时间:2021-09-05 06:40:30
[表设计]
1.VARCHAR(N),N表示的是字符数不是字节数,N尽可能小,因为MySQL一个表中所有的VARCHAR字段最大长度是65535个字节,进行排序和创建临时表一类的内存操作时,会使用N的长度申请内存。
VARCHAR(M),如果M<256时会使用一个字节来存储长度,如果M>=256则使用两个字节来存储长度。

2.注意数值类型括号后面的数字只是表示宽度而跟存储范围没有关系,比如INT(3)默认显示3位,空格补齐,超出时正常显示。

3.存储时间(精确到秒)建议使用TIMESTAMP或INT类型,因为TIMESTAMP/INT占用4字节,DATETIME占用8个字节
DATETIME和TIMESTAMP都是精确到秒,优先选择TIMESTAMP,因为TIMESTAMP只有4个字节,而DATETIME8个字节。同时TIMESTAMP具有自动赋值以及自动更新的特性。
如何使用TIMESTAMP的自动赋值属性?
a) 将当前时间作为ts的默认值:ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP。
b) 当行更新时,更新ts的值:ts TIMESTAMP DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP。
c) 可以将1和2结合起来:ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP。

4.建议字段定义为NOT NULL,索引字段必须字义为NOT NULL。
a)如果null字段被索引,需要额外的1字节
b)使索引,索引统计,值的比较变得更复杂
c)可用0,”代替
d)如果是索引字段,一定要定义为not null

5.业务实时日志默认禁止保存到数据库,建议保存到日志文件,对于保存到数据库的日志一般对事务无要求,请使用myisam表。

6.历史数据可追朔,如对于状态数据,应当设计相应状态的字段来保存该数据的最后状态,同时记录下来该数据的初始创建人,时间以及该数据的最后修改人和修改时间。

[索引]
1.单张表的索引数量控制在字段数的20%以内。
InnoDB的secondary index使用b+tree来存储,因此在UPDATE、DELETE、INSERT的时候需要对b+tree进行调整,过多的索引会减慢更新的速度。

2.ORDER BY,GROUP BY,DISTINCT的字段需要添加在索引的后面。

3.禁止使用%前缀模糊查询,例如LIKE “%ziduan”。

4.对长度过长的VARCHAR字段建立索引时,添加crc32或者MD5 Hash字段,对Hash字段建立索引,模糊匹配时使用前辍索引。

5.合理创建联合索引(避免冗余),(a,b,c) 相当于 (a) 、(a,b) 、(a,b,c)。[关联索引]

6.不使用外键,高并发时容易引起死锁等问题

[SQL语句]
1.线上拒绝:大SQL,大事务,大批量

2.SQL语句尽可能简单,可能一条大SQL就把整个数据库堵死,将复杂SQL拆分为多条简单SQL

3.SQL语句中IN包含的值不应过多,默认不超过200个,in里禁止使用子查询。

4.避免使用存储过程、触发器、函数等,容易将业务逻辑和DB耦合在一起。