MySQL分区表-按月份归类
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL分区表-按月份归类相关的知识,希望对你有一定的参考价值。
参考技术A mysql单表数据量,建议不要超过2000W行,否则会对性能有较大影响。最近接手了一个项目,单表数据超7000W行,一条简单的查询语句等了50多分钟都没出结果,实在是难受,最终,我们决定用分区表。一般的表(innodb)创建后只有一个 idb 文件:
创建按月份分区的分区表,注意!除了常规主键外,月份字段(用来分区的字段)也必须是主键:
当删除表时,该表的所有分区文件都会被删除
MySQL单机优化---分表分区分库
一、分表:
水平分表:根据条件把数据分为N个表(例如:商品表中有月份列,则可以按月份进行水平分表)。
使用场景:一张表中数据太多,查询效率太慢。
当需要同时查询被水平分表的多张表时:
在两条SQL语句中间加union,就能把两表数据合并展示。
union:数据合并时去重。
Union all:数据合并展示不去重。
垂直分表:将表的字段拆出来变成一张表,两表通过外键建立一对一关系。
使用场景:有些表记录数并不多,但是字段却很长,表占用空间很大,检索表时需要执行大量I/O,严重降低了性能。
当需要同时用到两表的数据时,可以通过 left join 进行两表查询。
二、分库:(配置多数据源)
垂直分库:根据不同业务将不同的表分到不同的数据库。
水平分库:将同一张表中的数据分到不同的数据库中。
三、分区:
表没变,但是保存表数据的从一个文件被分成了多个文件,用户感知不到。
分区的作用:
select *f rom dept where id in (1m2,3,4)
从MySQL 5.1 中新增了分区(Partition)功能,优势也越来越明显了:
--与单个磁盘或文件系统分区相比,可以存储更多的数据
--很容易就能删除不用或者过时的数据
--一些查询可以得到极大的优化 可以并发查询
--涉及到 SUM()/COUNT() 等聚合函数时,可以并发进行
--IO吞吐量更大(多台服务器)
分区的方式:
常见分区方式:
Range(范围) –基于一个给定的连续空间,把数据分配到不同分区。1-10 11-20
List(预定义列表) –类似Range分区,区别在List分区是基于枚举出的值列表分区,而 Range分区是根据给定的连续区间范围分区 1,2,3 4,5,6
Hash(哈希)–这中模式允许通过对表的一个或多个列的Hash Key进行计算,最后通过这个Hash码不同数值对应的数据区域进行分区。例如可以建立一个对表主键进行分 区的表。这个根据给定的分区个数,把数据分配到不同的分区。
Key(键值)-上面Hash模式的一种延伸,这里的Hash Key是MySQL系统产生的。
以上是关于MySQL分区表-按月份归类的主要内容,如果未能解决你的问题,请参考以下文章