浅谈Mysql常见注意事项一
浅谈Mysql常见注意事项一
-
不要在Mysql中使用utf8
Mysql中utf8并不是真正意义上的utf8,而是指的是utf8mb3,这种字符集仅支持BMP字符,码位在0到65535之间,不支持一些补充字符,例如一些生僻字和emoji表情。utf8mb3是Mysql早期就支持的字符集,由于不支持补充字符,Mysql在5.5.3之后的版本里面增加了utf8mb4的编码。在未来Mysql版本中,可能会删除utf8mb3字符集。utf8mb4支持BMP和补充字符,对于BMP字符,utf8mb4和utf8mb3相同,但是对于补充字符,utf8mb4需要4个字节存储,utf8mb3每个字符最多使用3个字节,无法存储该字符,所以在创建表,使用utf8mb4,而不是utf8或者utf8mb3。
字符集 支持的字符 每个字符存储需要的字节 utf8mb3、utf8(deprecated) BMP 1~3字节 ucs2 BMP 2字节 utf8mb4 BPM和补充字符 1~4字节 utf16 BMP和补充字符 2字节或4字节 utf16le BMP和补充字符 2字节或4字节 utf32 BMP和补充字符 4字节 Mysql官方文档说明:https://dev.mysql.com/doc/refman/8.0/en/charset-unicode.html
-
小数类型使用decimal
推荐使用decimal,不建议使用float和double,float和double会有精度丢失的问题,并且在比较值或者进行减法运算时可能会出现问题。decimal是定点数,在MySQL中,定点数是以字符串形式存储,所以在精度要求比较高时,推荐使用decimal类型。如果存储的数据超出decimal访问时,可以将数据按照整数和小数分开存储。
数据类型 说明 存储字节 float 单精度浮点数 4个字节 double 双精度浮点数 8个字节 decimal(M, D),M默认值是10 压缩的"严格"定点数 根据M和D而定 官网decimal存储字节表格
Leftover Digits Number of Bytes 0 0 1-2 1 3-4 2 5-6 3 7-9 4 decimal存储字节计算:Mysql是将每9位十进制存储为4个字节。
例如:以官网例子为例
decimal(18, 9):小数部分是9,需要4个字节,整数部分也是9,也需要4个字节。
decimal(20, 6): 小数部分是6,需要3个字节,整数部分是14,14-9=5,整数部分需要4个字节+剩余的5个存储需要的3个字节。
-
推荐统计值使用count(*)
在阿里JAVA开发手册中推荐使用count(*),不要使用count(列名),count(常量)。count(列名)会查询符合条件的并且列的值不为NULL的行数,也就是说会过滤掉列为NULL的行,除非有特殊的需求,所以一般不要使用。count(*)在MySQL8.0.13之后对SELECT COUNT(*) FROM tbl_name进行了优化,效率得到提升。InnoDB引擎count(*)和count(1)其实是一样的,不存在谁快谁慢的问题,不过推荐使用count(*),符合SQL92定义的标准统计行数的语法。以下附上官网关于count(*)的说明及链接,感兴趣的小伙伴可以研究研究官方文档。
MySQL官方文档说明:https://dev.mysql.com/doc/refman/8.0/en/aggregate-functions.html#function_count
As of MySQL 8.0.13, SELECT COUNT(*) FROM tbl_name query performance for InnoDB tables is optimized for single-threaded workloads if there are no extra clauses such as WHERE or GROUP BY.
InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way. There is no performance difference.
原文链接:https://monkey.blog.xpyvip.top/archives/qian-tan-mysql-chang-jian-zhu-yi-shi-xiang-yi