视图

视图是基于基表的虚表,它由sql查询来定义,可以当作表使用,但是视图中的数据没有实际的物理存储。视图可以作为安全层使用。
其作用在于一些应用程序本身并不关心基表,只需要按照视图定义来存取数据。

oracle提供的物化视图

Oracle支持物化视图,其不再是虚表,而是基于基表实际存在的表。物化视图可以用于预先计算并保存多表的链接或聚集等耗时操作的结果。在SQL server数据库中称为索引视图。在mysql 中可以使用基表加触发器的策略来实现“物化视图”。

分区表

innodb存储引擎支持水平分区,主要用于数据库的高可用管理。

MySQL数据库支持以下几种分区

  • range分区
    行数据基于给定分一个连续区间的列值被放入分区
  • list分区
    行数据基于一些离散的值被放入分区。
  • hash分区
    根据用户自定义的表达式的返回值进行分区(返回值不能是负,必须是整数)
  • key分区
    根据mysql提供的哈希函数进行分区

如果表中存在唯一索引或主键那么分区列必须是其的一部分

子分区

子分区就是在分区的基础上再进行分区。MySQL支持在range和list分区上再进行hash或key子分区。
每个子分区的数量必须相等

索引与算法

innodb支持几种常见的索引

  • B+树索引
  • 全文索引
  • 哈希索引

innodb支持的哈希索引是自适应的,储存引擎或根据表的使用情况自动为表生成哈希索引,不能认为干预

B+树

EK1s7d.md.jpg
B+树相关的定义和算法较为复杂,以后专门搞一篇B+树相关的笔记

聚集索引

innodb存储引擎将表中的数据按照主键顺序进行存放的。聚集索引就是根据每张表的主键构造一个B+树,叶子节点存放整张表的行记录数据。聚集索引的叶子节点也被称为数据页。在多数情况下查询器优化倾向于采用聚集索引。

聚集索引在物理存储上是不连续的,但在逻辑上是连续的。聚集索引子在排序查找和范围查找是分非常高效的。

辅助索引

辅助索引有叫做非聚集索引。辅助索引的叶子节点并不包含完整的行数据。叶子节点除了包括键值外还包含了指向完整行数据的书签。辅助索引的书签就是相应的行数据的聚集索引键。

辅助索引的存在并不会影响聚集索引,所以可以有多个辅助索引。

什么时候添加B+树索引
访问表中很少的一部分时使用B+树索引才有意义。对于低选择性的字段,不适合使用B+树索引。
通过查看列的Cardinality来观察所以是否时高选择性的。Cardinality表示索引中不从夫记录数量的预估值。建立索引的前提时列中的数据时高选择性的。

B+树索引的使用

联合索引

联合索引是指对表上的多个列进行索引。联合索引也时一颗B+树,不同的是联合索引的键值的数量是大于2的。

覆盖索引

即直接可以从辅助索引中就可以查询到想要的记录,而不需要查询聚集索引中的记录。使用覆盖索引的一个好处就是辅助索引不包含整行记录的说有信息,故其大小要远小于聚集索引,减少了IO操作的次数。

Multi-Range Read优化

Multi-Range Read优化的目的是减少离散的读取,并将随机访问转化为较为顺序的数据访问。
MRR优化的好处:

  • MRR使得数据的访问变得顺序,在辅助查询索引时,首先根据得到的查询结果,按照主键的进行排序,并按照主键的顺序进行书签查找。
  • 减少缓冲池中页被替换的次数
  • 批量处理队键值的查询操作

index condition pushdown优化

在使用了icp优化后,mysql数据库在根据where条件进行过滤记录时,会在取出索引的同时,判断是否可以进行where条件的过滤,将where的部分过滤操作放在了储存引擎层。