第七章 MySQL高级特性
MySQL从5.0和5.1版本开始引入很多高级特性,例如分区、触发器等
,这对有其他关系数据库使用背景的用户来说可能并不陌生。到底性能如何,还需要用户真正使用过才知道。
7.1 分区表
对于用户来说,分区表示一个独立的逻辑表,但是底层由多个物理子表构成,实现分区表的代码实际上是一对一组底层表的句柄对象的封装。
分区的一个主要目的是将数据按照一个较粗的粒度分在不同的表中。
在下面场景中,分区可以起到非常大的作用:
- 表非常大以至于无法放到内存中,或者只在表的最后部分有热点数据,其他均是历史数据。
- 分区表的数据更容易维护。(大批量删除可以用清楚整个分区的方式)
- 分区表可以分布在不同的物理设备上
- 可以使用分区表来避免某些特殊的瓶颈。
- 可以备份和恢复度独立分区。
7.1.1 分区表的原理
存储引擎也无需知道整个是一个普通标还是一个分区表,分区表的索引只是在各个底层表上各自加上一个完全相同的索引。
分区表的select、insert、update、delete操作都是分区层先打开并锁住所有底层表。
7.1.2 分区表的类型
mysql支持多种分区表,最多的是根据范围进行分区,每个分区存储落在某个范围记录。
还有其他分区技术包括:
- 键值分区,减少innodb的互斥量竞争
- 使用数据莫函数来分区,然后将数据轮询放入不同的分区
7.1.3 如何使用分区表
全量扫描数据,不要任何索引。
索引数据,并分离热点。
7.1.4 什么情况下会出问题
- NULL使分区失效
- 分区列和索隐裂不匹配
- 选择分区的成本可能很高
- 打开并锁住所有底层表的成本可能很高
- 维护分区的成本可能很高
7.1.5 查询优化
7.1.6 合并表
这个没有什么共鸣,难以理解。
7.2 视图
视图是mysql中的一个虚拟表,数据还是存储在原来的表上
7.2.1 可更新视图
7.2.2 视图对性能影响
7.2.3 视图的限制
Mysql还不支持物化视图,也不支持视图中创建索引。
7.3 外键约束
InnoDB是目前MySQL中唯一支持外键的内置存储引擎。
7.4 在MySQL内部存储代码
有人倡导使用存储代码,也有人反对,讨论其优点:
- 服务器内部执行,离数据最近。
- 代码重用,方便统一业务规则
- 简化代码的维护和版本更新
- 帮助提升安全,更细粒度的存储过程
- 服务器端可以缓存存储过程的执行计划
…
其缺点如下: - mySQL没有提供好用的开发和调试工具
- 存储代码效率要低
- 存储代码的部署带来额外的复杂性
- 有安全隐患
- 存储过程给数据库增加额外压力。
7.4.1 存储过程和函数
一个存储过程示例。
7.4.2 触发器
7.4.3 事件
7.4.4 在存储过程中保留住世
7.5 游标
7.6 绑定变量
7.6.1 绑定变量的优化
7.6.2 SQL接口的绑定变量
这个真的没有共鸣…
7.7 用户自定义函数(UDF)
7.8 插件
存储过程插件、后台插件、infomation_schema插件、全文解析插件、
7.9 字符集和校对
7.9.1 MySQL如何使用字符集
conf文件可以设置 也可以通过修改数据库来设置
7.9.2 选择字符集和校对规则
7.10 全文索引
7.10.1 自然语言的全文索引
tf-idf的思想。
7.10.2 布尔全文索引
7.10.3 mySQL 5.1中全文索引的变化
7.10.4 全文索引的限制和替代方案
- 全文索引更大的操作代价,但是更快的查找速度
7.11 分布式XA事务
###7.11.1 内部XA事务
7.11.2 外部XA事务
7.12 查询缓存
7.12.1 MySQL如何判断缓存命中
哈希索引
7.12.2 查询缓存如何使用内存
7.12.3 什么情况下查询缓存能发挥作用
7.12.5 InnoDB和查询缓存
7.12.7 通用查询缓存
7.13 总结
开眼界,但是现在都mysql5.6 了,估计有些高级特性都改变得很严重了。
外键、存储阔成、绑定变量、插件、字符集、全文索引、XA事务、查询缓存。