MySQL-分区表 对底层表的封装 , 意味着索引也是按照分区的子表定义的,而没有全局索引 。(所以即使有唯一性索引,在不同子表中可能会有重复数据)
单表数据量超大时索引失效
将单表分区成数个区域,通过分区函数,可以快速地定位到数据的区域 。而且相比于索引,分区不需要额外的数据结构记录每个分区的数据,代价更低 。只需要一个简单的表达式就可以指向正确的分区
可以只是用简单的分区方式存放表,不要任何索引,只要将查询定位到需要的大致数据位置,通过where条件 , 将需要的数据限制在少数分区中,则效率是很高的 。WARNNING:查询需要扫描的分区个数限制在一个很小的数量 。
如果数据有明显的“热点”,可以将热点数据单独放在一个分区,让这个分区的数据能够有机会都缓存在内存中 。
如果分区表达式的值可以是NULL:第一个分区会使一个特殊分区 。以partition by range year(order_date)为例,所有在order_date列为NULL或者非法值的数据都会被放到第一个分区 。那么所有的查询在定位分区后都会增加扫描第一个分区 。而且如果第一个分区很大的时候,查询的成本会被这个“拖油瓶”分区无情的增加 。
创建一个无用的第一分区可以解决这个问题,partition p_nulls values less than (0);
对于分区列和索引列不匹配的查询 , 虽然查询能够使用索引,但是无法通过分区定位到目标数据的分区(也就是数据分布相对更加分散),需要遍历每个分区内的索引,除非查询中的条件同时也包含分区条件 。所以期望分区条件范围被热门查询索引所包含 。
对于范围分区技术 , 需要适当限制分区的数量,否则对于大量数据批量导入的场景,选择分区的成本过高 。对于大多数系统,100个左右的分区是没有问题的 。
MySQL数据库性能优化之分区分表分库分表是分散数据库压力的好方法 。
分表,最直白的意思,就是将一个表结构分为多个表 , 然后,可以再同一个库里,也可以放到不同的库 。
当然,首先要知道什么情况下 , 才需要分表 。个人觉得单表记录条数达到百万到千万级别时就要使用分表了 。
分表的分类
**1、纵向分表**
将本来可以在同一个表的内容,人为划分为多个表 。(所谓的本来,是指按照关系型数据库的第三范式要求,是应该在同一个表的 。)
分表理由:根据数据的活跃度进行分离,(因为不同活跃的数据,处理方式是不同的)
案例:
对于一个博客系统 , 文章标题,作者,分类,创建时间等,是变化频率慢,查询次数多,而且最好有很好的实时性的数据,我们把它叫做冷数据 。而博客的浏览量,回复数等,类似的统计信息 , 或者别的变化频率比较高的数据,我们把它叫做活跃数据 。所以,在进行数据库结构设计的时候,就应该考虑分表,首先是纵向分表的处理 。
这样纵向分表后:
首先存储引擎的使用不同,冷数据使用MyIsam 可以有更好的查询数据 。活跃数据,可以使用Innodb ,可以有更好的更新速度 。
其次,对冷数据进行更多的从库配置,因为更多的操作时查询 , 这样来加快查询速度 。对热数据,可以相对有更多的主库的横向分表处理 。
其实,对于一些特殊的活跃数据,也可以考虑使用memcache ,redis之类的缓存,等累计到一定量再去更新数据库 。或者mongodb 一类的nosql 数据库,这里只是举例,就先不说这个 。
**2、横向分表**
字面意思 , 就可以看出来 , 是把大的表结构,横向切割为同样结构的不同表 , 如 , 用户信息表,user_1,user_2等 。表结构是完全一样,但是,根据某些特定的规则来划分的表,如根据用户ID来取模划分 。
推荐阅读
- b站怎么录屏直播画画,b站直播如何录屏直播
- 新媒体如何改变医疗,新媒体在医疗行业中的作用
- 主播平台怎么加入直播,如何加入直播公司做主播
- java最牛逼的两行代码 java输入两行数
- linux命令行配置网络,linux进行网络配置
- 虚拟机挂英雄联盟,虚拟机挂英雄联盟出错
- 北营直播运营,北京直播运营招聘信息
- 关于函数在Python的表示的信息
- 包含安卓手机能开通视频号的词条