分区表
以后用到了再看
视图
视图本身是一个虚拟表, 不存放任何数据. 实现视图最简单的方法是将select语句的结果存放到临时表中.
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
外键约束
InnoDB是MYSQL中唯一支持外键的内置存储引擎.
- 使用外键增加成本, 通常每次在修改数据时需要在另外一张表中多执行一次查找操作
- 某些场景会提高性能, 外键比在应用程序中检查一致性的性能高很多, 此外, 在数据的删除和更新上也更高效, 不过外键的维护是逐行进行的, 比批量删除或更新要慢些
- 外键约束使得查询会额外访问一些别的表, 意味着需要额外的锁, 甚至会导致一些难以排查的死锁
如果只是使用外键做约束, 通常在应用程序中实现会更好
在MYSQL内部存储代码
mysql允许通过触发器, 存储过程, 函数的形式来存储代码. 从mysql5.1开始, 还可以在定时任务中存储代码, 这个定时任务也被称之为事件.
优点:
- 在服务器内部执行, 离数据近, 节省带宽和网络延迟
- 代码重用
- 简化代码维护和版本更新. 备份维护可以在服务端完成
- 有助于提升安全, 提供更细粒度的权限控制.
- 服务端可以缓存存储过程的执行计划, 降低消耗
- 利于分工
缺点:
- mysql没有提供很好的开发调试工具, 导致不易编写
- 相比应用程序的代码, 存储代码效率要差些, 且能使用的函数有限, 难以实现太复杂的逻辑
- 需要额外维护
- 由于存储过程维护在服务器端, 可能有安全隐患
- 给数据库额外的压力, 数据库的拓展性比应用程序要差很多
- mysql并没有什么选项可以控制存储程序的资源消耗, 所以在存储过程中的一个小错误, 可能直接把服务拖死
- 存储代码有诸多限制
- 调用困难, 只能拿到sql进一步分析
- 它和基于语句的二进制日志复制合作的并不好
存储过程和函数
触发器
可以使用触发器实现一些强制限制, 或者某些业务逻辑, 还可以用于自动更新反范式化数据或者汇总表数据. 因为可以减少客户端与服务端的通信, 因此可以简化应用逻辑, 提高性能.
事件
类似于linux的定时任务,可以指定在某个时候执行, 或者每隔一段时间执行一段sql, 在一个独立事件调度线程中被初始化, 可以在表INFORMATION_SCHEMA.EVENTS来看到各事件状态, 通常会将复杂sql封装到存储过程中, 事件执行时调用存储过程.
游标
mysql只提供只读的, 单向的游标, 并且只能在存储过程或者更底层的客户端API中使用. 游标中指向的对象都是存储在临时表中
注意:
- 打开游标的时候需要执行整个查询
- 游标也会让mysql执行一些额外的I/O操作, 而这些操作的效率可能非常低, 当临时表大于tmp_table_size的时候, mysql会创建临时磁盘表来存放
绑定变量
好处:
- 在服务端只需要解析一次sql语句, 某些优化器的工作只需执行一次, 也会缓存一部分的执行计划
- 仅参数发送到服务端, 网络开销小
- mysql在存储参数时, 直接将其存放到缓存中, 不需在内存中多次复制
- 相对安全, 减少了sql注入和攻击的风险
用户自定义函数
这本书的阅读告一段落———————>江湖再见