第七章 MySQL高级特性

MySQL从5.0和5.1版本开始引入很多高级特性,例如分区、触发器等,这对有其他关系数据库使用背景的用户来说可能并不陌生。到底性能如何,还需要用户真正使用过才知道。

7.1 分区表

对于用户来说,分区表示一个独立的逻辑表,但是底层由多个物理子表构成,实现分区表的代码实际上是一对一组底层表的句柄对象的封装。

分区的一个主要目的是将数据按照一个较粗的粒度分在不同的表中。

在下面场景中,分区可以起到非常大的作用:

  • 表非常大以至于无法放到内存中,或者只在表的最后部分有热点数据,其他均是历史数据。
  • 分区表的数据更容易维护。(大批量删除可以用清楚整个分区的方式)
  • 分区表可以分布在不同的物理设备上
  • 可以使用分区表来避免某些特殊的瓶颈。
  • 可以备份和恢复度独立分区。

7.1.1 分区表的原理

存储引擎也无需知道整个是一个普通标还是一个分区表,分区表的索引只是在各个底层表上各自加上一个完全相同的索引。

分区表的select、insert、update、delete操作都是分区层先打开并锁住所有底层表。
第七章 MySQL高级特性

7.1.2 分区表的类型

mysql支持多种分区表,最多的是根据范围进行分区,每个分区存储落在某个范围记录。
还有其他分区技术包括:

  • 键值分区,减少innodb的互斥量竞争
  • 使用数据莫函数来分区,然后将数据轮询放入不同的分区

7.1.3 如何使用分区表

第七章 MySQL高级特性

第七章 MySQL高级特性
全量扫描数据,不要任何索引。
索引数据,并分离热点。

7.1.4 什么情况下会出问题

  • NULL使分区失效
  • 分区列和索隐裂不匹配
  • 选择分区的成本可能很高
  • 打开并锁住所有底层表的成本可能很高
  • 维护分区的成本可能很高

7.1.5 查询优化

第七章 MySQL高级特性
第七章 MySQL高级特性

7.1.6 合并表

第七章 MySQL高级特性
这个没有什么共鸣,难以理解。

7.2 视图

视图是mysql中的一个虚拟表,数据还是存储在原来的表上
第七章 MySQL高级特性
第七章 MySQL高级特性
第七章 MySQL高级特性

7.2.1 可更新视图

第七章 MySQL高级特性

7.2.2 视图对性能影响

7.2.3 视图的限制

Mysql还不支持物化视图,也不支持视图中创建索引。

7.3 外键约束

InnoDB是目前MySQL中唯一支持外键的内置存储引擎。

第七章 MySQL高级特性

7.4 在MySQL内部存储代码

第七章 MySQL高级特性
有人倡导使用存储代码,也有人反对,讨论其优点:

  • 服务器内部执行,离数据最近。
  • 代码重用,方便统一业务规则
  • 简化代码的维护和版本更新
  • 帮助提升安全,更细粒度的存储过程
  • 服务器端可以缓存存储过程的执行计划

    其缺点如下:
  • mySQL没有提供好用的开发和调试工具
  • 存储代码效率要低
  • 存储代码的部署带来额外的复杂性
  • 有安全隐患
  • 存储过程给数据库增加额外压力。

7.4.1 存储过程和函数

第七章 MySQL高级特性
一个存储过程示例。

7.4.2 触发器

第七章 MySQL高级特性

7.4.3 事件

第七章 MySQL高级特性

7.4.4 在存储过程中保留住世

第七章 MySQL高级特性

7.5 游标

第七章 MySQL高级特性

7.6 绑定变量

7.6.1 绑定变量的优化

第七章 MySQL高级特性

7.6.2 SQL接口的绑定变量

这个真的没有共鸣…

7.7 用户自定义函数(UDF)

第七章 MySQL高级特性

7.8 插件

第七章 MySQL高级特性
存储过程插件、后台插件、infomation_schema插件、全文解析插件、

7.9 字符集和校对

7.9.1 MySQL如何使用字符集

第七章 MySQL高级特性
第七章 MySQL高级特性
conf文件可以设置 也可以通过修改数据库来设置

7.9.2 选择字符集和校对规则

第七章 MySQL高级特性

7.10 全文索引

第七章 MySQL高级特性

7.10.1 自然语言的全文索引

第七章 MySQL高级特性
tf-idf的思想。

7.10.2 布尔全文索引

第七章 MySQL高级特性

7.10.3 mySQL 5.1中全文索引的变化

7.10.4 全文索引的限制和替代方案

第七章 MySQL高级特性

  • 全文索引更大的操作代价,但是更快的查找速度

7.11 分布式XA事务

第七章 MySQL高级特性

第七章 MySQL高级特性

###7.11.1 内部XA事务

7.11.2 外部XA事务

第七章 MySQL高级特性

7.12 查询缓存

第七章 MySQL高级特性

7.12.1 MySQL如何判断缓存命中

第七章 MySQL高级特性
哈希索引

7.12.2 查询缓存如何使用内存

第七章 MySQL高级特性
第七章 MySQL高级特性

7.12.3 什么情况下查询缓存能发挥作用

第七章 MySQL高级特性
第七章 MySQL高级特性

7.12.5 InnoDB和查询缓存

第七章 MySQL高级特性

7.12.7 通用查询缓存

第七章 MySQL高级特性

7.13 总结

开眼界,但是现在都mysql5.6 了,估计有些高级特性都改变得很严重了。

第七章 MySQL高级特性
外键、存储阔成、绑定变量、插件、字符集、全文索引、XA事务、查询缓存。

第七章 MySQL高级特性