侧边栏壁纸
博主头像
Monkey部落博主等级

Monkey部落,分享技术、经验、遇到的问题及解决方法,欢迎大家互相讨论分享。

  • 累计撰写 43 篇文章
  • 累计创建 35 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

浅谈Mysql常见注意事项一

Monkey部落
2022-10-07 / 0 评论 / 0 点赞 / 129 阅读 / 1,028 字

浅谈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) 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

  2. 小数类型使用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个字节。

  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.

关注微信公众号「平哥技术站」, 每日更新,在手机上阅读所有教程,随时随地都能学习。

觉得写的还不错的小伙伴,请作者喝杯咖啡☕ ,支持一下。😊

如有侵权请立即与我们联系,我们将及时处理,联系邮箱:865934097@qq.com。

0

评论区