mysql 进阶 几个重要知识点

书本上学到的都是一些mysql 知识都是很基础的,很难深入理解mysql的底层原理。直接去看源码又有几个人能做到?
记录mysql的一些重点难点,以期未来整合深入理解mysql

InnoDB逻辑存储单元主要分为表空间、段、区、页

1、mysql 页 (16KB)

页是InnoDB存储引擎磁盘管理的最小单位,每个页默认16KB
也就是1024 * 16 = 16384 B。

SHOW GLOBAL STATUS LIKE 'Innodb_page_size';

mysql页可以存多少数据 mysql一页有多少kb_mysql


参考:https://jishuin.proginn.com/p/763bfbd33765

2、MySQL 行 (mysql表的内部表示具有65,535字节的最大行大小限制)

InnoDB存储引擎是按行进行存放的,每个页存放的行记录也是有硬性定义的,最多允许存放16KB/2-200,即7992行记录
InnoDB 对于4KB,8KB,16KB和32KB innodb_page_size 设置,表 的最大行大小(适用于本地存储在数据库页面内的数据)略小于页面的一半 。例如:
对于默认的16KB InnoDB页面大小,最大行大小略小于8KB 。

3. Mysql 区 (extent)

在 InnoDB 存储引擎中,一个区会分配 64 个连续的页。因为 InnoDB 中的页大小默认是 16KB,所以一个区的大小是 64*16KB=1MB。在任何情况下每个区大小都为1MB,为了保证页的连续性,InnoDB存储引擎每次从磁盘一次申请4-5个区。

4、Mysql 段(segment)

段 由一个或多个区组成,区在文件系统是一个连续分配的空间 ,不过在段中不要求区与区之间是相邻的。段是数据库中的分配单位,不同类型的数据库对象以不同的段形式存在。当我们创建数据表、索引的时候,就会相应创建对应的段,比如创建一张表时会创建一个表段,创建一个索引时会创建一个索引段。

5、数据页分裂

假设你现在已经有两个数据页了。并且你正在往第二个数据页中写数据。
关于B+Tree,你肯定知道B+Tree中的叶子结点之间是通过双向链表关联起来的。
在InnoDB索引的设定中,要求主键索引是递增的,这样在构建索引树的时候才更加方便。

那假设你自定义了主键索引,而且你自定义的这个主键索引并不一定是自增的。
然后随着你将数据写入。就导致后一个数据页中的所有行并不一定比前一个数据页中的行的id大。
这时就会触发页分裂的逻辑。
页分裂的目的就是保证:后一个数据页中的所有行主键值比前一个数据页中主键值大。

6、SQL执行顺序

  • 给定sql
SELECT DISTINCT <select_list>
FROM  <left_table> <join_type>
JOIN  <right_table> ON <join_condition>
WHERE  <where_condition>
GROUP BY  <group_by_list>
HAVING <having_condition>
ORDER BY <order_by_condition>
LIMIT <limit_number>
  • 解析顺序
FROM  <left_table>
ON <join_condition>
<join_type> JOIN  <right_table> 
WHERE  <where_condition>
GROUP BY  <group_by_list>
HAVING <having_condition>
SELECT
DISTINCT <select_list>
ORDER BY <order_by_condition>
LIMIT <limit_number>

7、再回头 理解 MySQL索引-B+树