Zohar's blog

MySQL - 【问题导向】通用基础知识

DatabaseDatabaseMySql

问题导向的方式学习 MySQL,与系统性知识相结合,拯救我的记忆力

基础

一条 SQL 语句的查询过程怎样的?

SQL 查询过程

  1. 客户端与服务端通信,这个通信过程是半双工的,客户端发送数据给服务端是服务端无法同时返回数据。当查询语句非常长时(如批量插入语句),需要修改 max_allowed_packet 参数增加服务端允许接收的包大小。

  2. 如果查询缓存已经打开,则判断是否可以使用查询缓存。如果查询命中查询缓存,直接放回结果。

  3. 对 SQL 语句进行语法解析和预处理,判断是否存在语法问题。

  4. 查询优化器进行查询优化,优化器通过预估各种查询方式的查询成本,选择查询成本最低的一条生成查询计划。查询成本小不一定代表着执行时间短。

  5. 调用引擎接口查询数据。

  6. 如果查询缓存已开启,且判断该 SQL 查询频率较高,则将该 SQL 查询结果写入查询缓存。

  7. 服务端发送数据,数据量大则分为多个包进行发送。

设计

为什么尽量不使用 UUID 作为主键?

  1. 主键最好尽量地短,MySQL 中 UUID 为 36 长度的字符串(或 32 位长度,去掉四条下划线),占用空间较大。

  2. 在 B+ 索引中字符串按字典序进行排序,由于 UUID 是随机生成的,没有顺序,因此插入操作不像自增主键一样可以插入到索引末端,而是离散存储,因此插入速度慢,也更容易引起页分裂。

  3. 影响辅助索引。由于辅助索引的叶子节点存储的是主键值,因此主键过大会导致辅助索引单页存储的索引数量更少。

单表数据量太大该怎么办?