高级特性:分区、视图、外键、存储过程(触发器、存储函数和事件)、绑定变量、插件、字符集、全文索引、XA事务(分布式事务)、查询缓存。
一、分区
对用户来说,分区表是一张逻辑表,但是底部由多个物理子表组成。意味着索引也按照分区子表定义,没有全局索引。
1、分区的作用
- 表数据非常多,无法全部加载到内存中,或者有热点数据,其他的是历史数据。
- 分区表的数据更加容易维护。(对单独一个分区进行CURD)
- 分区表的数据可以分布到不同的物理设备上,高效利用硬件设备。
2、分区的限制
- 一张表最多有1024个分区
- 按列分区,或分区表达式必须返回整数
- 如果分区的列包含主键或索引,那么所有的主键或索引都必须包含进来
- 分区表无法使用外键约束(通过外键约束一次性更新多张表)
3、分区的原理
分区表由多张底层表实现,这些底层表也是由句柄对象表示。存储引擎管理分区的各个底层表和管理普通表一样,分区表索引只是在各个底层表上各自加上一个完全相同的索引。
对分区表进行CURD操作,存储引擎会打开分区表并锁住全部底层表,但并不是锁住全表。主要是看存储引擎的类型,如INNODB是实现行级锁,会在分区层释放表锁。
4、分区的类型
- 最多是按范围分区,每个分区存储在某个范围的数据。分区表达式可以是列,也可以是列的表达式。
- 还支持键值、哈希和列表分区
5、分区使用的策略
- 全量扫描数据,不做任何索引
- 索引数据,并分离热点数据
6、分区的局限
对于分区的使用策略,有两个非常重要的假设:查询能够过滤掉很多额外的分区,分区本身并不会带来很多额外的开销。
- NULL值会使分区过滤无效(都会默认存放在第一分区)
- 分区列和索引列不匹配(无法进行分区过滤)
- 选择分区的成本可能很高(分区数越大,成本越高)
- 打开并锁住所有底层表的成本可能很高
- 维护分区的成本可能很高(重组分区的成本很高)
总结:
1、分区数不能太多(100个内)
2、尽量让数据均匀落在各个分区内
3、最好不要跨区查询数据
4、查询sql最好包含分区列