7.1分区表

对用户来说分区表是一个独立的逻辑单元,对应用是透明的。但是底层是由多个物理表组成的,实现分区表的代码实际上对一组底层表的句柄对象的封装。分区表额主要目的就是将数据按照一个粗的粒度分到不同的表中。

原理:分区表实际上是很多的普通表,底层表都是由句柄对象调用存储引擎来执行。无论是增删改查都是先锁住底层所有表,然后根据分区键找到对应的分区,再调用对应的存储引擎接口来访问各个分区的数据。

类型:比较常用的按照范围进行分区

  1. create table sales(
  2. order_date datetime not null comment "订单日期"
  3. ) engine =innodb partition by range(year(order_date))(
  4. partition p_2010 values less than (2010),
  5. partition p_2011 values less than (2011),
  6. partition p_catchaall values less than MAXVALUE
  7. );

弊端:当分区列和索引列不匹配的时候,可能会造成查询无法进行分区过滤。相当于每个查询都必须带上分区键,这样才可能有效的锁定到某个范围。

注意点:由于分区表在MySQL并不成熟,实际上生产环境使用该特性的比较少,但是我们需要理解这种思想,对于更大的数据量其实inforbrigth使用基于块数据的访问思路。

7.2视图

  • 1 MySQL视图,视图本来就是一个虚拟的表,不存放数据,只有表定义的语句。在SQL访问视图的时候,本质是通过视图语句转化成原来的物理表的SQL操作。这里有两个重要算法:
  • 2 合并算法,如果原表记录和视图记录建立的是一对一的衍射关系,那么通过视图查询就是合并算法,索引利用率则更高。
  1. CREATE VIEW `view_check_info` AS
  2. select APPLY_HOSPITAL_FK,check_no,adm_id,patient_name from `check_info`
  3. where (`check_info`.`APPLY_HOSPITAL_FK` = 100149)
  4. mysql> explain select * from view_check_info where check_no='457878';
  5. +----+-------------+------------+------+-----------------+-----------------+---------+-------------+------+-----------------------+
  6. | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
  7. +----+-------------+------------+------+-----------------+-----------------+---------+-------------+------+-----------------------+
  8. | 1 | SIMPLE | check_info | ref | idx_hos_checkno | idx_hos_checkno | 68 | const,const | 1 | Using index condition |
  9. +----+-------------+------------+------+-----------------+-----------------+---------+-------------+------+-----------------------+
  • 3 临时表算法,如果原表记录和视图记录建立的非一对一的衍射关系,比方说视图中使用group by,distinct,聚合函数,union等,在外层视图查询的使用只能使用派生表的查询方式。
  1. CREATE VIEW `view_check_info` AS
  2. select distinct APPLY_HOSPITAL_FK,check_no,adm_id,patient_name from `check_info`
  3. where (`check_info`.`APPLY_HOSPITAL_FK` = 100149)
  4. mysql> explain select * from view_check_info where check_no='457878';
  5. mysql> explain select * from view_distinct_check_info where check_no='457878';
  6. +----+-------------+------------+------+-----------------+-----------------+---------+-------+--------+-------------+
  7. | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
  8. +----+-------------+------------+------+-----------------+-----------------+---------+-------+--------+-------------+
  9. | 1 | PRIMARY | <derived2> | ref | <auto_key0> | <auto_key0> | 63 | const | 10 | Using where |
  10. | 2 | DERIVED | check_info | ref | idx_hos_checkno | idx_hos_checkno | 5 | const | 285348 | NULL |
  11. +----+-------------+------------+------+-----------------+-----------------+---------+-------+--------+-------------+

下面为两者示意图:
7.MySQL高级特性 - 图1

  • 4 物化视图:不仅存储了最新的表结构而且存储了最新的数据,只是说数据的同步做到了实时,且对用户无感知。

7.3分布式(XA)事务

存储引擎的事务特性能够保证在存储引擎级别实现ACID,而分布式事务则让存储引擎级别的ACID拓展到数据库层面,甚至是多个数据库实例之间,这就需要大名鼎鼎的二阶段提交。

在MySQL中主要存在两种XA事务。一方面,MySQL可以参与到外部的分布式事务中;第二方面,自己可以通过XA事务来协调存储引擎和binlog数据的同步问题。

在这里面我们假设MySQL记录binlog看做是一个独立的存储引擎,那么原来innodb和这个存储引擎就构成了XA分布式事务。