Mysql分区表
来源:互联网 发布:薪酬数据分析哪些内容 编辑:程序博客网 时间:2024/06/10 21:06
分区表是一种粗粒度,简易的索引策略,适用于大数据的过滤场景.最适合的场景是,没有合适的索引时,对其中几个分区表进行全表扫描.或者只有一个分区表和索引是热点,而且这个分区和索引能够全部存储在内存中。限制单表分区数不要超过150个,并且注意某些导致无法做分区过滤的细节,分区表对于单条记录的查询没有优势,需要注意这类查询的性能。
分区表语法
分区表分为RANGE,LIST,HASH,KEY四种类型,并且分区表的索引是可以局部针对分区表建立的:
CREATE TABLE sales ( id INT AUTO_INCREMENT, amout DOUBLE NOT NULL, order_day DATETIME NOT NULL, PRIMARY KEY(id,order_day)) ENGINE=Innodb PARTITION BY RANGE(YEAR()order_day))( PARTITION p_2010 VALUES LESS THAN (2010), PARTITION p_2011 VALUES LESS THAN (2011), PARTITION p_2012 VALUES LESS THAN (2012), PARTITION p_catchall VALUES THAN MAXVALUE);
这段语句表示将表内数据按照order_dy的年份范围进行分区,2010年一个区,2011一个,2012一个,剩下的一个。
要注意如果这么做,则order_day必须包含在主键中,且会产生一个问题,就是当年份超过阈值,到了2013,2014时,需要手动创建这些分区。
替代方法就是使用HASH:
CREATE TABLE sales ( int INT PRIMARY KEY AUTO_INCREMENT, amount DOUBLE NOT NULL, order_day DATETIME NOT NULL) ENGINE=Innodb PARTITION BY HASH(id DIV 1000000);
这种分区表每100W条数据建立一个分区,且没有阈值范围的影响。
分区表的应用
对于大数据(如10TB)而言,索引起到的作用相对小,因为索引的空间与维护成本很高,另外如果不是索引覆盖查询,将导致回表,造成大量磁盘IO.那么对于这种情况的解决策略是:
1.全量扫描数据,不要任何索引
通过分区表表达式将数据定位在少量的分区表,然后正常访问这些分区表的数据;
2.分离热点,索引数据
将热点数据分离出来在一个小的分区,并对分区建立索引,对热点数据的查询提高效率.
分区表的问题
1.NULL值使分区过滤无效
2. 选择分区的成本
3. 分区列和索引列不匹配
如果索引列和分区列不匹配,且查询中没有包含过滤分区的条件,会导致无法进行分区过滤,那么将会导致查询所有分区。
4. 打开并锁住所有底层表
分区表的的查询策略是在分区过滤之前,打开并锁住所有底层表,这会造成额外的开销,解决问题的方法是尽量使用批量操作,例如LOAD DATA INFILE,或者一次删除多行数据。
分区表的查询条件
过滤分区表的WHERE条件必须是切分分区表的列,而不能带有函数,例如只能是order_day,而不能是YEAR(order_day)。
- mysql分区表
- Mysql 分区表
- MySQL分区表
- MySQL分区表
- MySQL分区表
- [MySQL] 分区表
- MySQL分区表
- Mysql 分区表
- MySQL分区表
- MySQL分区表
- MySQL 分区表
- mysql分区表
- MySQL 分区表
- MySQL分区表
- MySQL分区表
- MySQL 分区表
- Mysql分区表
- MySQL 分区表
- 不积跬步,无以至千里 small tips
- 微信消息推送详解
- VMware linux 系统 安装VMware tools 工具的流程
- TensorFlow基础知识:计算图中的Op,边,和张量
- tensorflow rnn阅读笔记
- Mysql分区表
- 使用Snapdragon Profiler工具分析Dragonboard410c(一)
- android 最简单的轮播图片
- spring管理属性配置文件properties——使用PropertiesFactoryBean
- 2017-6-28(数据库)
- 设计模式之原型模式
- 算法导论计数排序实现
- 最常犯错误
- Android studio 手动配置Gradle的方法