加入收藏 | 设为首页 | 会员中心 | 我要投稿 济南站长网 (https://www.0531zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

高性能的MySQL(7)分区技术详解

发布时间:2016-08-02 08:24:45 所属栏目:MySql教程 来源:站长网
导读:在我之前的2篇博客中已经简单介绍过MySQL5.1之后的分区技术的基本理论和分区技术的表存储文件及特点,博客地址如下: http://janephp.blog.51cto.com/4439680/1
在我之前的2篇博客中已经简单介绍过MySQL5.1之后的分区技术的基本理论和分区技术的表存储文件及特点,博客地址如下:

http://janephp.blog.51cto.com/4439680/1305220

http://janephp.blog.51cto.com/4439680/1305937

今天要介绍一下分区技术一些使用场景和机制。

MySQL实现分区表的方式--对底层表封装--意味着索引也按照分区的子表定义的,而没有全局索引。

一、在下面的场景中,作用非常大:

1、表非常大无法全部放到内存中,或者表的最后部分有热点数据,其他均是历史数据。

2、分区的数据更容易维护,可以对整个分区操作,还可以对独立分区进行优化、检查、修复操作。

3、分区表的数据可以分布在不同的物理设备上

4、可以使用分区表来避免某些特殊的瓶颈,例如InnoDB的单个索引互斥访问。

分区表本身也有一些限制:

1、一个表最多只能有1024个分区

2、分区表达式必须是整数,或者返回整数的表达式。

3、分区表无法使用外键

二、分区表的原理

存储引擎管理分区的各个底层表和管理普通表一样,所有底层表都必须使用相同的引擎,从存储引擎来看,底层表和普通表么有任何不同。

分区表按照下面的操作逻辑进行:

SELECT:

当查询一个分区表的时候,分区层先打开并锁住所有底层表,优化器先判断是否可以过滤掉部分分区,然后进行操作。

INSERT:

当写入一条记录时,分区层先打开并锁住所有的底层表,然后确定哪个分区接收这个记录,操作。

DELETE:

当删除一条记录时,分区层先打开并锁住所有的底层表,然后确定哪个分区接收这个记录,操作。

UPDATE:

当更新一条记录时,分区层先打开并锁住所有的底层表,确定分区,然后取出数据并更新,再判断更新后的数据放到哪个分区,然后进行写入操作,并对原数据所在底层表进行删除。

URL:http://www.bianceng.cn/database/MySQL/201410/46075.htm

但并不是每个操作都会锁住所有的表,如果引擎有自己的行级锁,例如InnoDB,则会在分区层释放对应的表锁。

三、如何使用

一般有2个策略:

1、全量扫描数据,不要任何索引。

2、索引数据,并分离热点。

但是必须注意到一下几点:

1、NULL会使分区过滤无效。

第一个分区是一个特殊分区,假设按照PARTITION BY RANGE YEAR(order_date)分区,那么所有order_date为null的或者非法值的,都会被存储到第一个分区。所以这样的查询where order_date between '2012-01-01' and '2012-12-31'会检测2个分区,除了2012这个分区还会检测第一个分区。

为了避免这种情况,可以创建一个无用的第一分区,例如 PARTITION p_null VALUES LESS THAN(0),这样即使检索代价很小的。

2、分区列和索引列不匹配,会导致无法进行分区过滤。

如果a上有索引,而列b进行分区,因为每个分区都有自己独立的索引,所以扫描列b上的索引就需要扫描每一个分区对应的索引。

特别在一个关联查询中,分区表在关联顺序的第二个表,并且索引分区列不匹配,则关联时针对第一个表符合条件的每一个表,都需要访问并搜索第二个表的所有分区。

3、选择分区、打开并锁表,维护分区可能代价很高。

4、所有分区都必须相同的存储引擎。

5、某些引擎不支持分区。

6、分区函数中可以使用的函数和表达式也有一些限制啊。

(编辑:济南站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读