MySQL

MySQL

MySQL执行流程

客户端向MySQL发起请求(一般使用数据库连接池减少线程的开关)

MySQL Server开始执行

  • 连接器: 控制用户的连接

  • 分析器: 词法分析, 语法分析

  • 优化器: 优化SQL语句, 规定执行流程

    • 可以查看SQL语句的执行计划, 可以采用对用的优化点, 来加快查询
  • 执行器: SQL语句的实际执行组件

存储引擎: 不同的存放位置, 不同的文件格式

  • InnoDB: 磁盘

    • 支持事务, 性能比较好. 具有自动崩溃恢复机制, 支持行锁, 创建数据库时, 默认是innodb
  • MyISAM: 磁盘

    • 5.1及老版本默认的, 支持表锁. 不支持事务, 不支持行锁, 崩溃后不能保证安全恢复. 只针对读操作, 表比较小. 表锁导致的性能问题
  • memory: 内存

    • 访问速度快, 重启或崩溃数据丢失. 可以当成redis使用, hash索引, 查找单个数据速度快, 支持表锁, 不支持TEXT/BLOG大文本, 并且是固定长度, 比较浪费空间

      • 查找单个数据速度快

      • 查找单个数据速度快

      • 查找单个数据速度快

  • Archive

    • 只能insert和select. 缓存所有写, 并且zlib插入数据库中. 适合日志的采集
  • blackhole

    • 不会存储任何的数据, 不会有任何保存. insert into, 表的日志. 备份表(插入日志. 不推荐使用)
  • Ferderated

    • 一个远程到mysql服务器的客户端连接(SQL -> Ferderated -> 远程另外一台服务执行): 默认禁掉

打开profile, 查看SQL语句执行流程所耗费的时间

  • set profiling=1;

  • show profile all for query [ID]

  • select * from xxx;

新版本出现更好的分析引擎performance_schema

查看MySQL客户端连接数信息

  • show processlist;

schema与数据优化

数据类型的优化

  • 更小的通常更好

    一般情况下,应该尽量使用可以正确存储数据的最小数据类型 。更小的数据类型通常更快,因为它们占用更少的磁盘、内存和CPU缓存,并且处理时需要的CPU周期也更少。

  • 简单就好

    简单数据类型的操作通常需要更少的CPU周期。

    例如,整型比字符操作代价更低,因为字符集和校对规则使字符比较复杂与整型比较。
    例如,使用Mysql的內建类型而不是字符串来存储日期和时间。
    例如:用整型存储IP地址。

    • 整数int的类型区分

      1. tinyint 8bit 1个字符
      2. smallint 16bit 2个字符
      3. mediumint 24bit 3个字符
      4. int 32bit 4个字符
      5. bigint 64bit 8个字符
    • 记录货币使用什么字段类型

      • decimal

        decial是精准的货币类型, 但是在存储的时候转成字符串, 但是性能有影响

      • double

        不精准

      • bigint

        将系统中的货币*100存成整数类型

    • 谈一谈字符串类型

      • varchar

        可变长的字符串, 当存储不知道具体长度时, 使用varchar, 节约空间.
        并且额外需要1-2个字节需要记录字符串的长度

        • varchar位数的区别 #进行中

          varchar(5) 和 varchar(200) 在存储的时候有没有差异?
          答: 没有差异, 因为是变长的

          但是如果varchar(255)大于255以上的时候, 记录长度的会使用2个字节, 剩下的没有差别

          55:29

      • char

        char是定长的, 当存储的字段的值是固定的情况下

  • 尽量避免NULL

    如果计划在列上建索引,就应该尽量避免设计成可为NULL 的列。因为一列中, 每一个NULL值都是唯一的(NULL = NULL 结果是false)InnoDB使用单独的一位(bit)存储NULL值,所以对于稀疏数据 有很好的空间效率。并且NULL值很难被优化

合理使用范式和反范式

  • 范式

    • 优点

      • 范式化的更新通常比反范式要快

      • 当数据较好的范式化后, 很少或者没有重复的数据

      • 范式化的数据比较小, 可以放在内充中, 操作比较快

      • 减少数据的冗余

    • 缺点

      • 通常需要进行关联
  • 反范式

    • 优点

      • 所有的数据都在同一张表中, 可以避免关联

      • 可以设计有效的索引

    • 缺点

      • 表格内的冗余较多, 删除数据时候会造成表有用的信息丢失

使用MySQL枚举类型替代字符串: 减少空间占用, 原理是枚举中有对应的字符串, 实际存储是MySQL生成的整形值, 比如("aaa"), 那么aaa在数据库中存储的就可能是1

datetime和timestamp

  • timestamp

    • 占用4个字节

    • 时间范围:1970-01-01到2038-01-19

    • 精确到秒

    • 采用整形存储

    • 依赖数据库设置的时区

    • 自动更新timestamp列的值

  • date

    • 占用的字节数比使用字符串、datetime、int存储要少,使用date类型只需要3个字节

    • 使用date类型还可以利用日期时间函数进行日期之间的计算

    • date类型用于保存1000-01-O1到9999-12-31之间的日期

  • datetime

    • 占用8个字节

    • 与时区无关,数据库底层时区配置,对datetime无效

    • 可保存到毫秒

    • 可保存时间范围大

    • 不要使用字符串存储日期类型,占用空间大,损失日期类型函数的便捷性

文本和字符串类型

  • varchar

    • 使用最小的符合需求的长度。

    • varchar(n) n小于等于255使用额外一个字节保存长度,n>255使用额外两个字节保存长度。

    • varchar(5)与varchar(255)保存同样的内容,硬盘存储空间相同,但内存空间占用不同,是指定的大小。

    • varchar在mysql5.6之前变更长度,或者从255一下变更到255以上时时,都会导致锁表。

    • 应用场景

      • 存储长度波动较大的数据,如:文章,有的会很短有的会很长

      • 字符串很少更新的场景,每次更新后都会重算并使用额外存储空间保存长度

      • 适合保存多字节字符,如:汉字,特殊字符等

  • char固定长度的字符串

    • 最大长度:255

    • 会自动删除未尾的空格

    • 检索效率、写效率会比varchar高,以空间换时间

    • 应用场景

      • 存储长度波动不大的数据,如: md5摘要

      • 存储短字符串、经常更新的字符串

通过索引优化

主键的选择

  • 代理主键

    • 与业务无关的,无意义的数字序列
  • 自然主键

    • 事物属性中的自然唯一标识
  • 推荐使用代理主键

    • 它们不与业务耦合,因此更容易维护

    • 一个大多数表,最好是全部表,通用的键策略能够减少需要编写的源码数量,减少系统的总体拥有成本*

posted @ 2023-02-26 00:39  孟大凡  阅读(18)  评论(0编辑  收藏  举报