- 数据库和表的字符集统一,尽量使用UTF8(根据业务需求)
- 兼容性更好,统一字符集可以避免由于字符集转换产生的乱码,不同的字符集进行比较前需要进行转换会造成索引失效
- UTF8和UTF8MB4字段进行关联,会导致索引失效
- 除非特殊情况,禁止建表指定字符集(采用库默认字符集),降低出现字符集不统一导致性能问题的风险。
- 无特殊要求,禁止指定表COLLATE -----
COLLATE主要的作用是排序的规则以及检索的规则,utf8字符集默认的是 utf8_general_ci ,utf8mb4字符集默认的是utf8mb4_general_ci,结尾的ci意思是不区分大小写。
COLLATE会影响到ORDER BY语句的顺序,会影响到WHERE条件中大于小于号筛选出来的结果,会影响DISTINCT、GROUP BY、HAVING语句的查询结果。比如:select * from test where name like 'A%',在 utf8_bin字符集下,是无法检索出 ‘abc’字段的,并且排序的情况下Abc和abc所在的顺序是不一致的。
- 慎重选择row_format(行记录格式)
Barracuda: 新的文件格式。它支持InnoDB的所有行格式,包括新的行格式:COMPRESSED 和 DYNAMIC
在 msyql 5.7.9 及以后版本,默认行格式由innodb_default_row_format变量决定,它的默认值是DYNAMIC
db默认的innodb_file_format 为 Barracuda,默认的innodb_default_row_format为 dynamic;其中COMPRESSED 压缩比经测试最大也就 1/2,但读取和写入会有额外cpu开销,并且申请内存是按照解压后的原大小申请,在高并发情况下容易导致性能问题。
Dynamic行格式,列存储是否放到off-page页,主要取决于行大小,他会把行中最长的一列放到off-page,直到数据页能存放下两行。TEXT或BLOB列