分区表
对用户来说分区表是一个独立的逻辑表,但是底层是多个物理字表组成的,实现分区的代码实际上是对一组底层表的引用的封装。MySQL实现分区表的方式——对底层表封装,因而没有全局索引,分区可以将相关数据存放在一起,如果 一次性批量删除会变得简单。
应用场景:
- 表很大无法全部放到内存中,或者只有部分热点数据,其他事历史数据。
- 分区操作,更容易维护,如可以清除整个分区。
- 数据分布在不同物理设备,高效利用。
- 避免特殊的瓶颈,如InnoDB的单索引互斥访问
- 可以备份和恢复独立的分区。
缺陷: - 一个表最多只能有1024个分区。
- 无法使用外键,主键和唯一索引列必须包含进来。
- 分区表达式必须是整数,或者返回整数的表达式
操作原理:
当需要执行增删改查的时候,分区层先打开并锁住所有的底层表,确定分区,执行操作。
MySQL支持多种分区,最多的是根据范围分区,即每个分区存储落在某个范围的记录。
需求:从一个非常大的表中查询出一段时间的记录,而表包含很多年的历史数据,数据按照时间排序。
因为数据量巨大,不可能每次查询扫描全表,因为索引在空间和维护上的消耗,不希望使用索引,即便使用也会产生成千上万的随机I/O,程序便会僵死,也就是说B-Tree索引起不到作用。为了保证大数据量的可扩展性的策略:
- 使用简单的分区方式存放表,不要任何索引,根据分区的规则大致定位需要的数据位置,使用where条件将数据限制在少数分区中,提高效率。
- 数据热点分区,使用索引。如果数据有明显的热点,那么将这部分单独作为一个分区,并且有机会缓存在内存中。
注意事项 - NULL值会使分区过滤无效—可以直接使用列本身而不是基于列的函数进行分区;
- 分区列和索引列不匹配—如a列上的索引,却根据b列分区
- 开销大,打开并锁住所有底层表
视图
视图本身是一个虚拟表,数据是从其他表中生成的,甚至可以在视图上在定义一个视图
创建视图:
create view test-view as
select * from tab
with check option
直接使用:
select * from test-view
算法实现,
MySQL使用两种算法:合并算法(merge)临时表算法(temptable),
内部存储代码
- 触发器
- 存储过程
- 函数
- 事件
游标
字符集和校对
全文索引
查询缓存
优化服务器配置
- 配置文件
一般是/etc/my.cnf或/etc/mysql/my.cnf,会分成多个部分,每个部分的名称开头用方括号,服务器通常读取mysql这一段。