mysql的高级特性

1、分区表
  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的值都是有效的,第一个分区就是空,即使无效第一个分区的数据量也会很小。
 
2、视图
  Mysql 5.0版本后才开始引入视图。视图本身是一个虚拟表不存放任何数据。在使用SQL语句访问视图的时候返回的是Mysql从其他表中生成的,视图和表是在一个命名空间,不同对视图创建触发器也不能使用DROP TABLE命令删除视图。
创建一个视图:

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

 

posted on 2018-10-13 10:06  kma  阅读(160)  评论(0编辑  收藏  举报

导航