Mysql 索引介绍

--查看数据页默认大小,默认为16KB
show global status like ‘Innodb_page_size‘;

一个数据页看做树结构中的一个节点,一个数据页默认大小为16KB,一个数据页把它拆分成多个小块,每一小块把它叫做元素(Element)。
Element由索引值(Index)与数据(Data[address|record])组成。

data可以是address(地址值)大概占6B(字节);也可以是record(一条记录),大一点算1KB,一般没有这么大。

B-Tree数据特点

  • 节点中的每个元素都由元素element由索引值(index)跟记录(record)组成;
  • 每个节点元素之间是有序的;
  • 节点之间没有顺序关联

B+Tree数据特点

  • 非叶子节点的元素element由索引值(index)跟下一个节点的地址值(address)组成;
  • 叶子节点的元素element由索引值(index)跟记录(record)组成;
  • 每个节点元素之间是有序的;
  • 叶子节点之间是顺序关联的(可以理解为指针),非叶子节点之间没有关联

下面看看B+Tree下,一张表大概可以存放多少数据
根节点大概可以存放多少索引?

非叶子节点,一个元素占用空间大小:index(8B)+addrdss(6B) = element(14B)
叶子节点,一个元素占用空间大小:index(8B) + record(1KB) ≈ 1024B

根节点大致存放索引数:16 * 1024 / 14 = 1170个
第二层子节点存放索引数:1170 * 1170 = 1,368,900个

叶子节点存放数据:1170 * 1170 * (16 * 1024) / 1024 = 21,902,400。即是说这张表大概可以存放21,902,400数据。
根据阿里使用经验来看mysql一张表的数据最好不要超过500W,超过500W可以分表、分库。

mysql索引使用B+Tree的原因
1、每个数据页存放的数据更多。
2、在树深度相同情况下,可以存放更多的数据。
3、在表存放数据相同情况下,B-Tree的深度更大,导致I/O次数更多,因此查询更慢。
4、由于叶子节点之间有顺序关联关系,因此在进行范围查找时,可以减少查找次数。

Mysql 索引介绍

上一篇:关于Linux终端下 gdb 调试程序断点的设置详解 和 core 文件查看


下一篇:[Oracle 工程师手记] 记一次 MVIEW 刷新慢的分析