分区表

以后用到了再看

视图

视图本身是一个虚拟表, 不存放任何数据. 实现视图最简单的方法是将select语句的结果存放到临时表中.

  1. create view a as select *from b with check option;

with check option的作用参见:
https://www.ibm.com/support/knowledgecenter/zh/SSGU8G_12.1.0/com.ibm.ddi.doc/ids_ddi_096.htm
image.png
image.png

外键约束

InnoDB是MYSQL中唯一支持外键的内置存储引擎.

  • 使用外键增加成本, 通常每次在修改数据时需要在另外一张表中多执行一次查找操作
  • 某些场景会提高性能, 外键比在应用程序中检查一致性的性能高很多, 此外, 在数据的删除和更新上也更高效, 不过外键的维护是逐行进行的, 比批量删除或更新要慢些
  • 外键约束使得查询会额外访问一些别的表, 意味着需要额外的锁, 甚至会导致一些难以排查的死锁

如果只是使用外键做约束, 通常在应用程序中实现会更好

在MYSQL内部存储代码

mysql允许通过触发器, 存储过程, 函数的形式来存储代码. 从mysql5.1开始, 还可以在定时任务中存储代码, 这个定时任务也被称之为事件.
优点:

  • 在服务器内部执行, 离数据近, 节省带宽和网络延迟
  • 代码重用
  • 简化代码维护和版本更新. 备份维护可以在服务端完成
  • 有助于提升安全, 提供更细粒度的权限控制.
  • 服务端可以缓存存储过程的执行计划, 降低消耗
  • 利于分工

缺点:

  • mysql没有提供很好的开发调试工具, 导致不易编写
  • 相比应用程序的代码, 存储代码效率要差些, 且能使用的函数有限, 难以实现太复杂的逻辑
  • 需要额外维护
  • 由于存储过程维护在服务器端, 可能有安全隐患
  • 给数据库额外的压力, 数据库的拓展性比应用程序要差很多
  • mysql并没有什么选项可以控制存储程序的资源消耗, 所以在存储过程中的一个小错误, 可能直接把服务拖死
  • 存储代码有诸多限制
  • 调用困难, 只能拿到sql进一步分析
  • 它和基于语句的二进制日志复制合作的并不好

存储过程和函数

image.png

触发器

可以使用触发器实现一些强制限制, 或者某些业务逻辑, 还可以用于自动更新反范式化数据或者汇总表数据. 因为可以减少客户端与服务端的通信, 因此可以简化应用逻辑, 提高性能.
image.png

事件

类似于linux的定时任务,可以指定在某个时候执行, 或者每隔一段时间执行一段sql, 在一个独立事件调度线程中被初始化, 可以在表INFORMATION_SCHEMA.EVENTS来看到各事件状态, 通常会将复杂sql封装到存储过程中, 事件执行时调用存储过程.
image.png

游标

mysql只提供只读的, 单向的游标, 并且只能在存储过程或者更底层的客户端API中使用. 游标中指向的对象都是存储在临时表中
注意:

  • 打开游标的时候需要执行整个查询
  • 游标也会让mysql执行一些额外的I/O操作, 而这些操作的效率可能非常低, 当临时表大于tmp_table_size的时候, mysql会创建临时磁盘表来存放

绑定变量

image.png
好处:

  • 在服务端只需要解析一次sql语句, 某些优化器的工作只需执行一次, 也会缓存一部分的执行计划
  • 仅参数发送到服务端, 网络开销小
  • mysql在存储参数时, 直接将其存放到缓存中, 不需在内存中多次复制
  • 相对安全, 减少了sql注入和攻击的风险

image.png

用户自定义函数

这本书的阅读告一段落———————>江湖再见