MySQL分区表与索引

一、定义

简而言之就是将一张逻辑上仍然完整的表,在物理存储的过程中,将表上的数据按某种指定的划分依据,在物理上存放到多个“表空间”(物理文件上),这样查询数据时,不至于每次都扫描整张表而只是从当前的分区查到所要的数据,这样大大提高了数据查询的速度。
优点:

  • 改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度;
  • 增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用;
  • 维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可;
  • 均衡I/O:可以把不同的分区映射到不同磁盘以平衡I/O,改善整个系统性能。

缺点:

  • 已经存在的表没有方法可以直接转化为分区表,总之,利大于弊
  • 一个表最多只能有1024个分区
  • 分区表中无法使用外键约束
  • 各个底层表必须使用相同的存储引擎

二、分区表的原理

其实对存储引擎来说,底层表和普通表来说是没有什么区别的,这就像对CPU而言其实本质上所有的物理内存都是拥有同等地位的,只不过由于人为的设定才有了内核态与用户态一样,那么存储引擎会为每一个底层表都设置相同的索引,这样就可以实现快速定位与简单的优化过滤了。

  • 对于select,分区层会先打开并锁住所有底层表(对InnoDB来说可以只使用行锁),然后优化器会先判断过滤部分分区,然会调用存储引擎的接口开始访问数据
  • 对于insert,分区层会先打开并锁住所有底层表,然后确定对应分区将数据写入对应底层表
  • 对于delete,分区层会先打开并锁住所有底层表,然后确定对应分区将数据从对应底层表删除
  • 对于update,分区层会先打开并锁住所有底层表,然后确定对应分区将数据从对应底层表拿出,更新数据之后再来判断要插入那个分区,最后对底层表进行写入操作,然后将原数据从对应底层表删除

三、分区表的类型

通常是根据某一列的数据范围进行划分。
创建分区表要在使用create table命令时配合partition子句进行划分,需要注意的是partition子句使用的表达式的返回值要是一个确定的整数,且不能是一个常数。如假如使用日期进行分区我们就要使用year()或to_days()来进行处理得到一个具体的整数。

四、分区表的使用策略

  • 全量扫描数据,不为分区表建立索引
  • 索引数据,并分离热点
    第一点好理解,第二点其实就是指将会经常访问的数据分离出来,又可能的话就把这部分数据缓存到内存里面,这样查询的时候就可以只访问很小的一部分分区表了。需要注意的是这两点都是基于查询可以进行过滤而且分区不会造成额外代价这两点假设而言的,自然就会存在一些问题,进而导致遇到下面几个问题:
  • NULL值使得分区过滤无效
  • 分区列和索引列不匹配
  • 寻找查询对象时正确选择分区可能开销很大
  • 打开并锁住所有底层表的差别可能很高
  • 维护分区的成本可能很高

五、索引

1.建立索引的三种数据结构
  • 哈希索引
    对于key值相同的索引,哈希索引默认采用拉链法解决hash冲突。缺点是对于区间查询比较慢,需要逐项查找,所以这种索引结构只适合于等值查询的场景。
  • 有序数组索引
    此索引可以解决上面等值查询的问题,但是它不适合进行插入和删除操作,所以这对于数据库来说是不可忍受的,故它只能作用于静态存储引擎,负责索引不会发生变化的数据。
  • 多路搜索树
    为什么不使用二叉搜索树?
    因为索引也是文件,我们要把他放在磁盘上,对于二叉树我们都知道查找效率大约为O(logN),,其实就是树高,在使用机械硬盘进行数据读写时,一次IO可能就需要10ms,若树高为20,那可能查找到一个索引就需要200ms,这是不可接受的,但多路搜索树就不一样了,InnoDB使用的是1200叉树,只需要四层高的树就可以访问12003(约17亿)个值了,这样磁盘IO时间会极少。
2.InnoDB的索引模型

使用B+树索引模型,根据主键或者非主键建立的索引其查找复杂度不同。使用主键建立的索引我们叫做聚簇索引,使用非主键建立的索引叫做二次索引。之所以说二次索引不推荐使用就是因为其会先找到主键,然后依据主键索引继续查找,平白做了一点儿无用事。

3.覆盖索引

在使用非主键索引k查询结果时,若发现查询结果已经在K索引树上了的话就不需要去主键索引树上去查找了,即这个普通索引k索引树覆盖了我们的查询需求,所以称之为覆盖索引。
使用覆盖索引减少了树的搜索次数,显著提升了查询性能,所以使用覆盖索引是一个常用的性能优化手段。

4.InnoDB索引和MyISAM索引的区别
  • 一是主索引的区别,InnoDB的数据文件本身就是索引文件。而MyISAM的索引和数据是分开的。
  • 二是辅助索引的区别:InnoDB的辅助索引data域存储相应记录主键的值而不是地址。而MyISAM的辅助索引和主索引没有多大区别
5. InnoDB与MyISAM的区别
  • 使用索引结构的差别
  • 对事务的支持不同
  • 锁的粒度不同
  • 对于全文检索的支持不同
  • 效率不同,MyISAM的效率要高一点
  • MyISAM不支持外键,而 InnoDB是唯一支持外键的MySQL引擎
    关键字:索引,锁粒度,事务,外键,效率

[推荐阅读]:
mysql数据库面试总结
常见面试题整理–数据库篇(每位开发者必备)
如何理解关系型数据库的常见设计范式?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章