浅谈Mysql常见注意事项一

  1. 不要在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)BMP1~3字节
    ucs2BMP2字节
    utf8mb4BPM和补充字符1~4字节
    utf16BMP和补充字符2字节或4字节
    utf16leBMP和补充字符2字节或4字节
    utf32BMP和补充字符4字节

    Mysql官方文档说明:https://dev.mysql.com/doc/refman/8.0/en/charset-unicode.html

  2. 小数类型使用decimal

    推荐使用decimal,不建议使用float和double,float和double会有精度丢失的问题,并且在比较值或者进行减法运算时可能会出现问题。decimal是定点数,在MySQL中,定点数是以字符串形式存储,所以在精度要求比较高时,推荐使用decimal类型。如果存储的数据超出decimal访问时,可以将数据按照整数和小数分开存储。

    数据类型说明存储字节
    float单精度浮点数4个字节
    double双精度浮点数8个字节
    decimal(M, D),M默认值是10压缩的”严格”定点数根据M和D而定

    官网decimal存储字节表格

    Leftover DigitsNumber of Bytes
    00
    1-21
    3-42
    5-63
    7-94

    decimal存储字节计算:Mysql是将每9位十进制存储为4个字节。

    例如:以官网例子为例

    decimal(18, 9):小数部分是9,需要4个字节,整数部分也是9,也需要4个字节。

    decimal(20, 6): 小数部分是6,需要3个字节,整数部分是14,14-9=5,整数部分需要4个字节+剩余的5个存储需要的3个字节。

  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