分区表
分区表是一个独立的逻辑表,底层由多个物理子表组成,从存储引擎的角度来看,底层表和普通表没有任何区别
每一个分区表都会有一个使用 # 分隔命名的表文件
分区表的索引也是按照分区的子表定义的,没有全局索引,分区表的索引也只是再各个底层表中加上完全相同的索引
mysql再创建表的时候通过 partition by 字句定义每个分区存放的数据,分区表达式可以是列,也可以是包含列的表达式
再执行查询的时候,优化器会根据分区定义过滤不需要的分区,只查找包含需要数据的分区
分区的目的是把相关的数据存放再一起,如果想对某个分区进行操作就会很方便,例如删除整个分区
分区不需要精确定位数据的位置,也就是不需要额外的数据结构,所以代价很低
分区的原因:
再超大数据量的时候,索引就无法起作用了,除非是索引覆盖查询,否则会根据索引扫描的结果回表,如果数据量很大,会产生大量的随机i/o,数据库的响应时间可能会大到无法接受,而且维护索引的代价也非常高
分区可以理解为索引的最初形态,以非常小的代价定位到数据再哪一片区域,再在这片区域里可以做顺序扫描,也可以建立索引,还可以把数据都缓存到内存中
分区适合的场景:
表非常大,没办法全部放在内存中,或者只再表的最后部分有热点数据,其他都是历史数据
分区可以更容易进行批量删除和更新操作
分区可以分摊服务器压力,分区表的数据可以分布到不同的物理设备中
分区有利于备份,和数据的恢复
分区的限制:
分区表存在的问题:
如果分区表达式的值可以为null,会使分区过滤无效
如果定义的索引列和分区列不匹配,会导致查询无法进行分区过滤,
分区有很多种类型,对于范围分区的成本会很高,因为服务器需要扫描所有的分区定义列表来寻找合适的分区
执行sql语句的时候,需要先打开并锁住所有底层表,这个操作再分区过滤之前发生,会影响所有查询
维护分区的成本可能会很高,新增和删除会很快,但是重组分区会很慢,需要先创建临时分区,将数据复制到临时表没然后删除原分区
视图
视图的理解
视图是一种虚拟表 ,本身是不具有数据的,占用很少的内存空间,它是 SQL 中的一个重要概念。
视图建立在已有表的基础上, 视图赖以建立的这些表称为基表。
视图的创建和删除只影响视图本身,不影响对应的基表。但是当对视图中的数据进行增加、删除和修改操作时,数据表中的数据会相应地发生变化,反之亦然
向视图提供数据内容的语句为SELECT 语句, 可以将视图理解为存储起来的 SELECT 语句。
视图是向用户提供基表数据的另一种表现形式。当数据表比较复杂的情况下,视图可以帮助我 们把经常查询的结果集放到虚拟表中,提升使用效率。
不可更新的视图
视图的优缺点
优点:
视图缺点
视图的算法: