加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

MySQL索引道理与应用:索引范例,存储布局与锁

发布时间:2019-06-04 14:50:47 所属栏目:编程 来源:王下邀月熊_Chevalier
导读:在数据布局与算法--索引 https://url.wx-coder.cn/O07eI 一节中,我们接头了 B+Tree, LSM-Tree 这样的文件索引以及全文索引的基本算法,本文则会针对文件索引在相关型数据库中的现实应用举办切磋。 索引(Index)是辅佐数据库体系高效获取数据的数据布局,

三星索引指的是对付一个查询,设立了三个通用的索引前提满意的前提,成立的索引对付特定的查询每满意一个前提就暗示该索引获得一颗星,当该索引获得三颗星时就暗示该索引对付该查询是一个三星索引。三星索引是对付特定查询的最优索引,成立三星索引的前提如下:

  • 取出全部的等值谓词的列 (WHERE COL=…) 作为索引开头的列;
  • 将 ORDER BY 中的列插手到索引中;
  • 将查询语句中剩余的列插手到索引中,将易变得列放到最后以低落更新本钱。

譬如对付如下的查询,索引 (first_name, last_name, email) 就是一个三星索引:

  1. SELECT first_name, last_name, email FROM user WHERE first_name = 'aa' ORDER BY last_name; 

三星索引的建设进程可以发明如下纪律:

  • 包围等值谓词前提,如 first_name,可以过滤大部门的索引片数据;
  • 包围 order by 字段可以停止对功效集的排序,如 last_name;
  • 包围别的字段可以停止回磁盘读取数据,纵然用了包围索引扫描,如 email。

索引存储布局

MySQL 查询的时辰会先通过索引定位到对应的数据页,然后检测数据页是否在缓冲池内,假如在就直接返回,假如不在就去聚簇索引中通过磁盘 IO 读取对应的数据页并放入缓冲池。一个数据页会包括多个数据行。缓存池通过 LRU 算法对数据页举办打点,也就是最频仍行使的数据页排在列表前面,不常常行使的排在队尾,当缓冲池满了的时辰会裁减掉队尾的数据页。从磁盘新读取到的数据页并不会放在行列头部而是放在中间位置,这此中间位置可以通过参数举办修。缓冲池也可以配置多个实例,数据页按照哈希算法抉择放在哪个缓冲池。

在 MySQL 存储布局一文中,我们接头过 MySQL 数据页的存储布局。

Memory Architecture | 内存架构

InnoDB 的内存首要有以下几个部门构成:缓冲池 (buffer pool)、重做日记缓冲池(redo log buffer)以及特另外内存池(additional memory pool),如下图所示:

MySQL索引道理与应用:索引范例,存储布局与锁

个中缓冲池占最大块内存,用来缓存各自数据,数据文件按页(每页 16K)读取到缓冲池,按最近起码行使算法(LRU)保存缓存数据。缓冲池缓冲的数据范例有:数据页、索引页、插入缓冲、自顺应哈希索引、锁信息、数据字典信息等,个中数据页和索引页占了绝大部门内存。日记缓冲将重做日记信息先放入这个缓冲区,然后按必然频率(默以为 1s)将其革新至重做日记文件。

InnoDB 通过一些列靠山线程将相干操纵举办异步处理赏罚,同时借助缓冲池来减小 CPU 和磁盘速率上的差别。当查询的时辰会先通过索引定位到对应的数据页,然后检测数据页是否在缓冲池内,假如在就直接返回,假如不在就去聚簇索引中通过磁盘 IO 读取对应的数据页并放入缓冲池。一个数据页会包括多个数据行。缓存池通过 LRU 算法对数据页举办打点,也就是最频仍行使的数据页排在列表前面,不常常行使的排在队尾,当缓冲池满了的时辰会裁减掉队尾的数据页。从磁盘新读取到的数据页并不会放在行列头部而是放在中间位置,这此中间位置可以通过参数举办修。缓冲池也可以配置多个实例,数据页按照哈希算法抉择放在哪个缓冲池。

Storage Architecture | 存储布局

InnoDB 存储引擎的逻辑存储布局和 Oracle 大抵沟通,全部数据都被逻辑地存放在一个空间中,我们称之为表空间(tablespace)。表空间又由段(segment)、区(extent)、页(page)构成。页在一些文档中偶然也称为块(block),1 extent = 64 pages,InnoDB 存储引擎的逻辑存储布局大抵如图所示:

MySQL索引道理与应用:索引范例,存储布局与锁

表空间作为存储布局的最高层,全部数据都存放在表空间中,默认环境下用一个共享表空间 ibdata1 ,假如开启了 innodb_file_per_table 则每张表的数据将存储在单独的表空间中,也就是每张表城市有一个文件,

表空间由各个段组成,InnoDB 存储引擎由索引组织的,而索引中的叶子节点用来记录数据,存储在数据段,而非叶子节点用来构建索引,存储在索引段。区是由持续的页构成,任何环境下一个区都是 1MB,一个区中可以有多个页,每个页默以为 16KB ,以是默认环境下一个区中可以包括 64 个持续的页,页的巨细是可以通过 innodb_page_size 配置,页中存储的是详细的行记录。一行记录最终以二进制的方法存储在文件里。

从物理意义上来看,InnoDB 表由共享表空间、日记文件组(更精确地说,应该是 Redo 文件组)、表布局界说文件构成。若将 innodb_file_per_table 配置为 on,则每个表将独立地发生一个表空间文件,以 ibd 末了,数据、索引、表的内部数据字典信息都将生涯在这个单独的表空间文件中。表布局界说文件以 frm 末了,这个是与存储引擎无关的,任何存储引擎的表布局界说文件都一样,为 .frm 文件。

Process Architecture | 历程架构

默认环境下,InnoDB 的靠山线程有 7 个,个中 4 个 IO thread, 1 个 Master thread, 1 个 Lock monitor thread, 一个 Error monitor thread。InnoDB 的首要事变都是在一个单独的 Master 线程里完成的。Master 线程的优先级最高,它首要分为以下几个轮回:主轮回(loop)、靠山轮回(background loop)、革新轮回(flush loop)、停息轮回(suspend loop)。

MySQL索引道理与应用:索引范例,存储布局与锁

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读