很多同学会认为,分区表是把一张大表拆分成了多张小表,所以这样 MySQL 数据库的性能会有大幅提升。这是错误的认识!如果你寄希望于通过分区表提升性能,那么我不建议你使用分区,因为做不到。

分区表技术不是用于提升 MySQL 数据库的性能,而是方便数据的管理。


从表格中可以看到,B+ 树的高度为 4 能存放数十亿的数据,一次查询只需要占用 4 次 I/O,速度非常快。

但是当你使用分区之后,效果就不一样了,比如上面的表 t,我们根据时间拆成每年一张表,这时,虽然 B+ 树的高度从 4 降为了 3,但是这个提升微乎其微。

除此之外,分区表还会引入新的性能问题,比如非分区列的查询。非分区列的查询,即使分区列上已经创建了索引,但因为索引是每个分区文件对应的本地索引,所以要查询每个分区。

接着,我们看一下这条 SQL 以及它的执行计划:

SELECT * FROM t WHERE d = 'aaa'
******** 1. row ********id: 1select_type: SIMPLEtable: tpartitions: p0000,p2019,p2020,p9999type: ALL
possible_keys: NULLkey: NULLkey_len: NULLref: NULLrows: 2filtered: 50.00Extra: Using where

通过执行计划我们可以看到:上述 SQL 需要访问 4 个分区,假设每个分区需要 3 次 I/O,则这条 SQL 总共要 12 次 I/O。但是,如果使用普通表,记录数再多,也就 4 次的 I/O 的时间。

所以,分区表设计时,务必明白你的查询条件都带有分区字段,否则会扫描所有分区的数据或索引。所以,分区表设计不解决性能问题,更多的是解决数据迁移和备份的问题。

而为了让你更好理解分区表的使用,我们继续看一个真实业务的分区表设计。

分区表在业务上的设计

以电商中的订单表 Orders 为例,如果在类似淘宝的海量互联网业务中,Orders 表的数据量会非常巨大,假设一天产生 5000 万的订单,那么一年表 Orders 就有近 180 亿的记录。

所以对于订单表,在数据库中通常只保存最近一年甚至更短时间的数据,而历史订单数据会入历史库。除非存在 1 年以上退款的订单,大部分订单一旦完成,这些数据从业务角度就没用了。

那么如果你想方便管理订单表中的数据,可以对表 Orders 按年创建分区表,如:

CREATE TABLE `orders` (`o_orderkey` int NOT NULL,`O_CUSTKEY` int NOT NULL,`O_ORDERSTATUS` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,`O_TOTALPRICE` decimal(15,2) NOT NULL,`O_ORDERDATE` date NOT NULL,`O_ORDERPRIORITY` char(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,`O_CLERK` char(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,`O_SHIPPRIORITY` int NOT NULL,`O_COMMENT` varchar(79) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,PRIMARY KEY (`o_orderkey`,`O_ORDERDATE`),KEY `orders_fk1` (`O_CUSTKEY`),KEY `idx_orderdate` (`O_ORDERDATE`)
)PARTITION BY RANGE  COLUMNS(o_orderdate)
(PARTITION p0000 VALUES LESS THAN ('1992-01-01') ENGINE = InnoDB,PARTITION p1992 VALUES LESS THAN ('1993-01-01') ENGINE = InnoDB,PARTITION p1993 VALUES LESS THAN ('1994-01-01') ENGINE = InnoDB,PARTITION p1994 VALUES LESS THAN ('1995-01-01') ENGINE = InnoDB,PARTITION p1995 VALUES LESS THAN ('1996-01-01') ENGINE = InnoDB,PARTITION p1996 VALUES LESS THAN ('1997-01-01') ENGINE = InnoDB,PARTITION p1997 VALUES LESS THAN ('1998-01-01') ENGINE = InnoDB,PARTITION p1998 VALUES LESS THAN ('1999-01-01') ENGINE = InnoDB,PARTITION p9999 VALUES LESS THAN (MAXVALUE)
)

你可以看到,这时 Orders 表的主键修改为了(o_orderkey,O_ORDERDATE),数据按照年进行分区存储。那么如果要删除 1 年前的数据,比如删除 1998 年的数据,之前需要使用下面的 SQL,比如:

DELETE FROM Orders
WHERE o_orderdate >= '1998-01-01' AND o_orderdate < '1999-01-01'

可这条 SQL 的执行相当慢,产生大量二进制日志,在生产系统上,也会导致数据库主从延迟的问题。而使用分区表的话,对于数据的管理就容易多了,你直接使用清空分区的命令就行:

ALTER TABLE orders_par
TRUNCATE PARTITION p1998

上述 SQL 执行速度非常快,因为实际执行过程是把分区文件删除和重建。另外产生的日志也只有一条 DDL 日志,也不会导致主从复制延迟问题。

# at 425#210328 12:10:12 server id 8888  end_log_pos 549        Query   thread_id=9     exec_time=0     error_code=0    Xid = 10SET TIMESTAMP=1619583012/*!*/;/*!80013 SET @@session.sql_require_primary_key=0*//*!*/;ALTER TABLE orders TRUNCATE PARTITION p1998/*!*/;

总结

  • 分区表不能提升性能

分区表的误区:性能提升相关推荐

  1. 大分区表高并发性能提升100倍?阿里云 RDS PostgreSQL 12 解读

    1. 问题 阿里云某客户发现自己使用读写分离实例,master的cpu特别高,而读写分离中承担读流量的slave节点却相对空闲.用户CPU打满后,访问到主节点的的线上服务受到了较大影响. 1.1 读写 ...

  2. 实现分区表性能提升超 10 倍,解密 TDSQL PG 版开源升级特性

    1 月 11 日,腾讯云 TDSQL PG 开源版(开源代号 TBase)再升级:分布区表关联查询性能(join)提升超 10 倍,同时提升了产品在分布式场景下的易用性,增加灵活可用的功能组件. 该升 ...

  3. 性能提升约 7 倍!Apache Flink 与 Apache Hive 的集成

    导读:随着 Flink 在流式计算的应用场景逐渐成熟和流行,如果 Flink 能同时把批量计算的应用场景处理好,就能减少用户在使用 Flink 时开发和维护的成本,并且能够丰富 Flink 的生态.S ...

  4. 性能提升约7倍!Apache Flink 与 Apache Hive 的集成

    导读:随着 Flink 在流式计算的应用场景逐渐成熟和流行,如果 Flink 能同时把批量计算的应用场景处理好,就能减少用户在使用 Flink 时开发和维护的成本,并且能够丰富 Flink 的生态.S ...

  5. 【华为云技术分享】40%性能提升,华为云推出PostgreSQL 12 商用版

    摘要:日前,华为云数据库正式推出了RDS for PostgreSQL 12版本,并开始商用.本文将从华为云RDS for PostgreSQL 12的4大特性和架构图等多方面来解读华为云Postgr ...

  6. Web的现状:网页性能提升指南

    互联网发展非常迅速,所以我们创造了Web平台.通常 我们会忽视连通性等问题,但用户们却不会视而不见 .一瞥万维网的现状,可以发现我们并没有用同情心.变通意识去构建它,更不要说性能了. 所以,今天的We ...

  7. 大叔也说并行和串行`性能提升N倍(N由操作系统位数和cpu核数决定)

    并行是.net4.5主打的技术,同时被封装到了System.Threading.Tasks命名空间下,对外提供了静态类Parallel,我们可以直接使用它的静态方法,它可以并行一个委托数组,或者一个I ...

  8. 深度干货!如何将深度学习训练性能提升数倍?

    作者 | 车漾,阿里云高级技术专家 顾荣,南京大学副研究员 责编 | 唐小引 头图 | CSDN 下载自东方 IC 出品 | CSDN(ID:CSDNnews) 近些年,以深度学习为代表的人工智能技术 ...

  9. 性能提升3倍的树莓派4,被爆设计缺陷!

    整理 | 屠敏 转载自CSDN(ID:CSDNnews) 一直以来,素有世界最小电脑之称的 Raspberry Pi(树莓派)是一种独特的存在.它不仅只有一块信用卡般的体积,还具备主机电脑所具备的功能 ...

  10. AAAI 2020 | 滴滴东北大学提出自动结构化剪枝压缩算法框架,性能提升高达120倍...

    点击上方"视学算法",选择"星标" 快速获得最新干货 2020 年 2 月 7 日-2 月 12 日,AAAI 2020 将于美国纽约举办.不久之前,大会官方公 ...

最新文章

  1. AC日记——积木大赛 洛谷 P1969
  2. xCode中工程相关的一些处理:一个工程包含多个Target的用途和使用方法【转】...
  3. java 中调用window系统中的文件,或者执行命令(shell、.CMD、.EXE)并获取返回值
  4. 小学生python入门-周边 | 小学生都开始学Python了,你还在等什么?
  5. Nginx 性能优化
  6. [HIHO1323]回文字符串(区间dp)
  7. ThinkPHP文件上传
  8. 对Linux上的各类型压缩格式的一个总结
  9. 理解 Java 的 GC 与 幽灵引用
  10. 51单片机和52单片机区别是什么?51仿真器有必要买吗?
  11. matlab给语音信号添加噪声
  12. Chrome 网页长截图
  13. 2022Java后端之美团笔试题
  14. unity 线渲染器LineRender
  15. 【数学-算法】1加到100的有趣算法
  16. 如何让自己的网站快速被百度收录(方法一)
  17. 进程管理和P V操作
  18. 内网代理神奇Venom
  19. GPS基础知识(五)、GPS导航电文
  20. AXIS摄像头IP配置方法

热门文章

  1. 进阶04 4 Collection集合类+Iterator迭代器+增强for+泛型
  2. 用Python显示灰度图像的灰度直方图
  3. 下载和安装CUDA和Cudnn(图文详解)
  4. 笨办法学python 3 48题_附录练习 8-10 笨办法学Python3
  5. python中 n是换几行_如何在Python中用`\ n`替换通用换行符?
  6. python read函数参数_最新Pandas.read_excel()全参数详解(案例实操,如何利用python导入excel)...
  7. 模块化加载_webpack模块化原理-异步加载模块
  8. idea debug异常关闭 Error running 'Tomcat8': Unable to open debugger port (127.0.0.1:50168): java.net.Soc
  9. easyUI 鼠标悬浮 和截取
  10. uniapp调用c语言方法,uni-app 入坑指南-web开发