开发者社区> 问答> 正文

MySQL分区表的相关问题

最近在学习MySQL的分区表,遇到了2个问题向大家请教一下。
1.建立一个测试表,有id,content和date3个字段,id为主键,按时间分区会报错
8
提示要把所有的分区字段设为主键,所以把date也设为主键
9
这样可以建表,但是这样就使用了复合主键,感觉不太好,而且用日期作主键也不太常见。
对数据库设计不太懂,不知道有没有办法可以只使用一个主键建立分区呢?
2.在执行查询操作的时候,MySQL优化器应该是按分区去查询数据(网上资料上找到的,不知道是不是这样。。),但是我在查询p3分区的数据却发现还查询了p1分区的数据
mysql> explain partitions -> select count(*) from test where date > date('2012-03-01') and date < date('2012-04-01');
id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | Extra
1 | SIMPLE | test | p1,p3 | index | NULL | PRIMARY | 12 | NULL | 3003 | Using where; Using index
不知道为什么会出现这种情况,是本来就是这样执行,还是操作错误呢?

展开
收起
落地花开啦 2016-02-08 13:05:29 2817 0
1 条回答
写回答
取消 提交回答
  • 什么是分表?

    分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,我们可以称为子表,每个表都对应三个文件,MYD数据文件,.MYI索引文件,.frm表结构文件。这些子表可以分布在同一块磁盘上,也可以在不同的机器上。app读写的时候根据事先定义好的规则得到对应的子表名,然后去操作它。

    什么是分区?

    分区和分表相似,都是按照规则分解表。不同在于分表将大表分解为若干个独立的实体表,而分区是将数据分段划分在多个位置存放,可以是同一块磁盘也可以在不同的机器。分区后,表面上还是一张表,但数据散列到多个位置了。app读写的时候操作的还是大表名字,db自动去组织分区的数据。

    mysql分表和分区有什么联系呢?
    1.都能提高mysql的性高,在高并发状态下都有一个良好的表现。
    2.分表和分区不矛盾,可以相互配合的,对于那些大访问量,并且表数据比较多的表,我们可以采取分表和分区结合的方式(如果merge这种分表方式,不能和分区配合的话,可以用其他的分表试),访问量不大,但是表数据很多的表,我们可以采取分区的方式等。
    3.分表技术是比较麻烦的,需要手动去创建子表,app服务端读写时候需要计算子表名。采用merge好一些,但也要创建子表和配置子表间的union关系。
    4.表分区相对于分表,操作方便,不需要创建子表。

    分表的几种方式:

    1、mysql集群

    它并不是分表,但起到了和分表相同的作用。集群可分担数据库的操作次数,将任务分担到多台数据库上。集群可以读写分离,减少读写压力。从而提升数据库性能。

    2、自定义规则分表

    大表可以按照业务的规则来分解为多个子表。通常为以下几种类型,也可自己定义规则。

    Range(范围)–这种模式允许将数据划分不同范围。例如可以将一个表通过年份划分成若干个分区。
    Hash(哈希)–这中模式允许通过对表的一个或多个列的Hash Key进行计算,最后通过这个Hash码不同数值对应的数据区域进行分区。例如可以建立一个对表主键进行分区的表。
    Key(键值)-上面Hash模式的一种延伸,这里的Hash Key是MySQL系统产生的。
    List(预定义列表)–这种模式允许系统通过预定义的列表的值来对数据进行分割。
    Composite(复合模式) –以上模式的组合使用 

    目前比较流行直接以标识字段取hash值,一般分库 跟分表都是基于相同字段,但是不同分母。

    2019-07-17 18:39:34
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
搭建电商项目架构连接MySQL 立即下载
搭建4层电商项目架构,实战连接MySQL 立即下载
PolarDB MySQL引擎重磅功能及产品能力盛大发布 立即下载

相关镜像