千万级大表的优化技巧
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
前言大表优化是一个老生常谈的话题,但随着业务规模的增长,总有人会“中招”。 很多小伙伴的数据库在刚开始的时候表现良好,查询也很流畅,但一旦表中的数据量上了千万级,性能问题就开始浮现:查询慢、写入卡、分页拖沓、甚至偶尔直接宕机。 这时大家可能会想,是不是数据库不行?是不是需要升级到更强的硬件? 其实很多情况下,根本问题在于没做好优化。 今天,我们就从问题本质讲起,逐步分析大表常见的性能瓶颈,以及如何一步步优化,希望对你会有所帮助。 1 为什么大表会慢?在搞优化之前,先搞清楚大表性能问题的根本原因。数据量大了,为什么数据库就慢了? 1.1 磁盘IO瓶颈大表的数据是存储在磁盘上的,数据库的查询通常会涉及到数据块的读取。 当数据量很大时,单次查询可能需要从多个磁盘块中读取大量数据,磁盘的读写速度会直接限制查询性能。 举例:假设有一张订单表
如果没有索引,数据库会扫描整个表的所有数据,再进行排序,性能肯定会拉胯。 1.2 索引失效或没有索引如果表的查询没有命中索引,数据库会进行全表扫描(Full Table Scan),也就是把表里的所有数据逐行读一遍。 这种操作在千万级别的数据下非常消耗资源,性能会急剧下降。 举例:比如你在查询时写了这样的条件:
这里用了 1.3 分页性能下降分页查询是大表中很常见的场景,但深度分页(比如第100页之后)会导致性能问题。 即使你只需要10条数据,但数据库仍然需要先扫描出前面所有的记录。 举例:查询第1000页的10条数据:
这条SQL实际上是让数据库先取出前9990条数据,然后丢掉,再返回后面的10条。 随着页码的增加,查询的性能会越来越差。 1.4 锁争用在高并发场景下,多个线程同时对同一张表进行增删改查操作,会导致行锁或表锁的争用,进而影响性能。 2 性能优化的总体思路性能优化的本质是减少不必要的IO、计算和锁竞争,目标是让数据库尽量少做“无用功”。 优化的总体思路可以总结为以下几点:
接下来,我们逐一展开。 3 表结构设计优化表结构是数据库性能优化的基础,设计不合理的表结构会导致后续的查询和存储性能问题。 3.1 精简字段类型字段的类型决定了存储的大小和查询的性能。
举例:
这样可以节省存储空间,查询时也更高效。 如果对表设计比较感兴趣,可以看看我之前的另一篇文章《表设计的18条军规》,里面有详细的介绍。 3.2 表拆分:垂直拆分与水平拆分垂直拆分当表中字段过多,某些字段并不是经常查询的,可以将表按照业务逻辑拆分为多个小表。 示例: 将订单表分为两个表:
水平拆分当单表的数据量过大时,可以按一定规则拆分到多张表中。 示例: 假设我们按用户ID对订单表进行水平拆分:
拆分后每张表的数据量大幅减少,查询性能会显著提升。 4 索引优化索引是数据库性能优化的“第一杀器”,但很多人对索引的使用并不熟悉,导致性能不升反降。 4.1 创建合适的索引为高频查询的字段创建索引,比如主键、外键、查询条件字段。 示例:
上面的复合索引可以同时加速 4.2 避免索引失效
如果对索引失效问题比较感兴趣,可以看看我之前的另一篇文章《聊聊索引失效的10种场景,太坑了》,里面有详细的介绍。 5 SQL优化5.1 减少查询字段只查询需要的字段,避免
5.2 分页优化深度分页时,使用“延迟游标”的方式避免扫描过多数据。
如果对SQL优化比较感兴趣,可以看看我之前的另一篇文章《聊聊sql优化的15个小技巧》,里面有详细的介绍。 6 分库分表6.1 水平分库分表当单表拆分后仍无法满足性能需求,可以通过分库分表将数据分散到多个数据库中。 常见的分库分表规则:
如果对分库分表比较感兴趣,可以看看我之前的另一篇文章《阿里二面:为什么要分库分表?》,里面有详细的介绍。 7 缓存与异步化7.1 使用Redis缓存热点数据对高频查询的数据可以存储到Redis中,减少对数据库的直接访问。 示例:
7.2 使用消息队列异步处理写操作高并发写入时,可以将写操作放入消息队列(如Kafka),然后异步批量写入数据库,减轻数据库压力。 如果对Kafka的一些问题比较感兴趣,可以看看我之前的另一篇文章《我用kafka两年踩过的一些非比寻常的坑》,里面有详细的介绍。 8 实战案例问题:某电商系统的订单表存储了5000万条记录,用户查询订单详情时,页面加载时间超过10秒。 解决方案:
总结大表性能优化是一个系统性工程,需要从表结构、索引、SQL到架构设计全方位考虑。 千万级别的数据量看似庞大,但通过合理的拆分、索引设计和缓存策略,可以让数据库轻松应对。 最重要的是,根据业务特点选择合适的优化策略,切勿盲目追求“高大上”的方案。 希望这些经验能帮到你! 转自https://www.cnblogs.com/12lisu/p/18801613 该文章在 2025/4/8 9:01:01 编辑过 |
关键字查询
相关文章
正在查询... |