mysql的高级特性

一、分区表
  1)分区表是一个独立的逻辑表,底层是由多个物理字表组成。实现分区的代码其实是对一组底层表的句柄对象的封装,对分区表的请求都会经过句柄对象转化为对存储引擎的接口调用,因此分区对于SQL层来讲是一个彻底封装底层实现的黑盒子,对应用是透明的。
  2)Mysql实现分区后,索引是按照分区的字表来定义的,没有全局的索引。
  3)注意几点:
    - 一个表最多只能由1024个分区;
    - Mysql5.1中分区的表达式必须是整数或者返回值为整数,在Mysql5.5中能够直接使用列来尽心个分区;
    - 若是分区字段中由主键或者惟一索引的列,那么全部主键和惟一索引列都必须包含进来。
    - 分区表中没法使用外键约束。
  4)第一个分区是特殊分区,在分区的表达 PARTITION BY RANGE (to_days(var)) 中var的值为null或者非法值时,记录都会存放在第一个分区,为了不第一个分区太大致使检索效果不好,通常第一个分区能够设置PARTITION BY RANGE (to_days(0)),若是var的值都是有效的,第一个分区就是空,即便无效第一个分区的数据量也会很小。
 
二、视图
  Mysql 5.0版本后才开始引入视图。视图自己是一个虚拟表不存听任何数据。在使用SQL语句访问视图的时候返回的是Mysql从其余表中生成的,视图和表是在一个命名空间,不一样对视图建立触发器也不能使用DROP TABLE命令删除视图。
建立一个视图:

  视图有两种实现:合并算法和临时表算法,若是可能会尽量使用合并算法,只有在视图中包含GROUP BY、DISTINCT、聚合函数、UNION、子查询等,没法在原纪录和视图创建一一映射的场景中,Mysql都会使用临时表来实现视图,也可使用EXPLAIN对视图肯定是用哪一种实现方法。
这里的select_type为“DERVIED”代表该视图采用的是临时表算法实现的。对于使用了临时表算法的视图没法更新数据的。
  
下图是两种表的实现算法:
 
三、Mysql内部存储代码
  Mysql容许经过触发器、存储过程和函数的形式来存储代码。从Mysql5.1开始能够在定时任务中存放代码,这个定时任务也称为“事件”。
  存储过程:
    - 每一个链接都有独立的存储过程的执行计划缓存
    - 存储程序越小越简单越好,更复杂的逻辑还须要交给上层的应用实现。
    - 使用存储过程对于一些小的查询或者插入操做优点很明显,相对于应用层面减小执行成本、解析和网络开销,因此通常对于测试环境造大量数据能够考虑存储过程来实现。
 四、主从数据复制
  1)mysql支持两种复制方法:基于行的复制和基于语句的复制。这两种复制方式都是经过在主库上记录二进制日志,在备库重放日志的方式来实现数据异步同步。
  2)数据复制的步骤:
    - 主库上把数据更改记录到二进制日志(Binary Log)中。在每次准备提交事务完成数据更新以前,主库将数据更新的事件记录到二进制日志中。Mysql是按照事务的提交顺序而非每条语句的执行顺序来记录日志,只有记录完毕日志后才会提交事务。
    - 备库将主库上的日志复制到本身的中继日志(Relay Log)中。备库会启动一个I/O线程跟主库创建链接,而后在主库上启动一个特殊的二进制转储(binlog dump)线程。这个二进制转储线程会读取主库上二进制日志中的事件。它不会对事件进行轮询,若是该线程追上主库将进入睡眠状态,直到主库发送信号通知有新的事件才会唤醒,备库I/O线程会将接收到的事件记录到中继日志中。
    - 备库的SQL线程执行最后一步,该线程从中继日志读取事件并在备库上执行,从而实现备库数据的更新。
  以下图因此,在主库中有一个二进制转储线程,从库中有两个线程:I/O线程从主库读取二进制到中继日志和SQL执行线程。
 
相关文章
相关标签/搜索