分区表
MySQL分区表的底层由多个物理子表组成,每个分区表都有一个使用#分隔命名的表文件。分区表对SQL层是透明的,,对分区表的请求会通过分区表的句柄(Handler Object)转化成对存储引擎接口的调用。每个分区表有自己的独立索引,整个表没有全局索引。查询时,优化器根据分区定义过滤不包含查询数据的分区。分区表是一种粗粒度的索引策略,单表最多1024个分区(最好不超过150),分区表无法使用外键约束。
分区表适用于以下场景:
- 在没有合适索引时,对其中几个分区进行全表扫描
- 表太大,无法放入内存
- 部分分区是热点域(例如按时间分区时,只有最近的记录是热点域)
- 需要对分区表进行独立操作(清除、检查、优化、备份、恢复或者使用不同的物理设备)
- 使用分区表规避特殊限制(如InnoDB的单个索引互斥访问,ext3文件系统的inode锁竞争等)
分区表使用方法
1 | create table sales { |
视图
视图是一种虚拟的数据表,它的行为和数据表一样,但是并不真正包含数据,但是不能对视图创建索引和触发器。实现视图的两种方法:
- 将SELECT语句的结果放到临时表中,即临时表算法(TEMPTABE),使用这种算法会有明显的性能问题。
- 重写使用视图的查询语句,将视图定义SQL合并到查询SQL中,即合并算法(MERGE)。
如果视图中包含GROUP BY,DISTINCT,聚合函数,UNION,子查询等,原表记录和视图记录中无法建立一一映射,MySQL将使用临时表算法来实现视图。可以通过视图来更新视图相关数据表的视图成为可更新视图,更新视图查询也可以是关联语句,但是被更新的列必须来自同一个表,所有使用临时表算法的视图都无法被更新。