从零起步学习MySQL 第十二章:MySQL分页性能如何优化?

前言:

今天在看学长面经时发现了这样一个问题:字节三面------MySQL分页性能如何优化?作为后端开发工程师,分页是我们日常开发中高频接触的需求,小到后台管理系统的列表查询,大到百万级商品库的分页展示,看似简单的 LIMIT 语句,在数据量激增后很容易成为系统性能瓶颈。

所以今天我们就来系统地讲解 MySQL 分页(pagination)在大数据量下常见的性能问题,深入分析背后的执行机制,用真实场景举例说明为什么 LIMIT OFFSET 会变慢,并给出多种实用的优化方案与实践建议(含完整 SQL 示例、优缺点详细比较与工程化落地注意事项)。本文适合后端开发工程师、数据库工程师,以及想要深入理解 MySQL 性能优化的读者阅读,全程干货,建议收藏备用。

一、什么是分页?为什么要分页

在 Web 应用中,分页是将大结果集分成若干页逐步返回给客户端的常见需求,最典型的场景就是商品列表、搜索结果、用户日志浏览、后台数据查询等。比如我们在电商平台搜索"手机",会看到"第1页、第2页..."的分页控件,点击后只加载当前页的10-20条数据,这就是分页的应用。

MySQL 中最典型的分页 SQL 表达式为:

sql 复制代码
SELECT * FROM orders ORDER BY id LIMIT 10 OFFSET 1000;

一键获取完整项目代码

分页的核心价值在于"按需加载":一方面可以节省网络带宽,避免一次性返回几十万、几百万条数据导致的网络拥堵;另一方面可以降低前端渲染成本,减少页面卡顿,提升用户体验。但很多开发者在使用分页时,只关注"实现功能",却忽略了性能问题,不当的分页实现会给数据库带来巨大压力,甚至拖垮整个系统。

二、MySQL 常见分页实现与执行成本

日常开发中,我们最常用的分页写法就是 LIMIT offset, count(或 LIMIT count OFFSET offset),比如"LIMIT 10 OFFSET 1000",表示跳过前1000条数据,返回接下来的10条。看似简单的语句,底层执行过程却远比我们想象的复杂,这里给大家拆解简化版的执行流程:

  1. 根据 SQL 中的 ORDER BY 规则,扫描或读取符合条件的行(如果排序字段有合适的索引,就按索引顺序读取;如果没有索引,就会进行全表扫描);

  2. 如果无法利用索引完成排序(比如排序字段没有索引、多字段排序且未建立联合索引),MySQL 会创建临时表,将读取到的行放入临时表中进行排序,极端情况下还会产生磁盘临时文件(当临时表数据量超过阈值时);

  3. 读取 offset + count 条结果,然后丢弃前 offset 条数据,只返回剩下的 count 条数据给客户端。

这里有一个关键结论:当 offset 很大时,数据库需要扫描或读取大量不需要返回的行,导致 I/O 开销、排序开销和 CPU 开销急剧上升。offset 越大,这种浪费就越严重,分页性能就越差。

举例说明(真实场景还原)

假设我们有一张 orders 订单表,表中共有 200 万行数据,主键 id 是自增的,现在需要查询第 200000 页(每页10条数据),对应的 SQL 如下:

sql 复制代码
SELECT * FROM orders ORDER BY id LIMIT 10 OFFSET 1999990;

一键获取完整项目代码

从逻辑上看,这条 SQL 只需要返回10条数据,但 MySQL 的执行过程是:先扫描并读取前 1999990 + 10 = 2000000 条数据,然后丢弃前 1999990 条,只返回最后10条。这就意味着,我们为了获取10条有用的数据,让数据库做了200万条数据的扫描、排序和筛选操作,这是极大的资源浪费,在高并发场景下,这样的 SQL 很容易成为慢查询,拖慢整个数据库的响应速度。

三、具体性能问题与触发条件

结合上面的执行过程,我们可以总结出 MySQL 分页常见的4个性能问题,以及对应的触发条件,帮大家快速定位自己项目中的隐患:

1. 大 OFFSET 导致大量扫描/读取

这是最常见的问题,也是分页性能差的核心原因。越靠后的页,offset 越大,数据库需要扫描的行数就越多,I/O 和 CPU 开销就越大。比如第1页(OFFSET 0)只需要扫描10条,第1000页(OFFSET 9990)需要扫描10000条,第100000页(OFFSET 999990)需要扫描1000000条,性能差距呈指数级扩大。

2. 无索引的排序

如果 ORDER BY 后的字段没有建立合适的索引,MySQL 就无法利用索引排序,只能进行"文件排序"(Using filesort),此时会创建临时表,将数据写入临时表后再排序。临时表如果过大,会写入磁盘,导致磁盘 I/O 激增,排序速度大幅下降。触发条件:排序字段无索引、多字段排序未建立联合索引、索引失效(如使用函数、隐式转换)。

3. SELECT * 导致回表(非覆盖索引)

很多开发者习惯用 SELECT * 查询所有字段,但如果查询的字段不在索引中,MySQL 会先通过索引找到对应的主键 id,再根据主键 id 去主键索引中读取完整的行数据,这个过程就是"回表"。回表会产生大量的随机 I/O,尤其是在大数据量分页场景下,回表次数越多,性能越差。触发条件:查询字段未完全包含在索引中(非覆盖索引)、使用 SELECT *。

4. 并发场景下的读不一致性与重复/漏数据

基于页码的分页(LIMIT OFFSET)在数据频繁变更(插入、删除、更新)的场景下,很容易出现数据重复或漏数据的问题。比如,用户正在浏览第2页,此时有一条新数据插入到第1页,那么原来第2页的第一条数据就会变成第1页的最后一条,用户再次刷新第2页时,就会漏掉这条数据;反之,如果删除了第1页的一条数据,第2页的第一条数据会重复出现。触发条件:高并发写入、数据频繁变更、使用页码式分页。

四、常见优化方案(按实用性排序,附实战示例)

针对上面的性能问题,我整理了6种常见的优化方案,按实用性和落地难度排序,每一种都附上完整的 SQL 示例、优缺点分析和适用场景,方便大家直接套用。

1. 基于游标的分页(Keyset Pagination)------ 首选方案

思路:放弃使用 OFFSET,而是根据排序键值(通常是自增主键、时间戳或有序索引列)记录当前页的边界值(比如上一页最后一条数据的 id),然后通过 WHERE 条件过滤掉边界之前的数据,再用 LIMIT 限制返回条数。这种方式本质是"基于位置的分页",而非"基于页码的分页"。

实战 SQL 示例(以 orders 表为例,按 id 升序分页):

-- 第 1 页(无边界值,直接取前10条)

sql 复制代码
SELECT id, order_no, create_time, status FROM orders WHERE status = 'OPEN' ORDER BY id ASC LIMIT 10;

-- 第 2 页(假设上一页最后一条数据的 id = 1023,过滤掉 id ≤ 1023 的数据)

sql 复制代码
SELECT id, order_no, create_time, status FROM orders WHERE status = 'OPEN' AND id > 1023 ORDER BY id ASC LIMIT 10;

-- 第 3 页(上一页最后一条 id = 1033)

sql 复制代码
SELECT id, order_no, create_time, status FROM orders WHERE status = 'OPEN' AND id > 1033 ORDER BY id ASC LIMIT 10;
sql 复制代码
SELECT id, order_no, create_time, status FROM orders WHERE status = 'OPEN' AND id > 1023 ORDER BY id ASC LIMIT 10;

优点:

  • 性能稳定:无论分页到第几页,读取的数据量都与返回量成正比(只读取当前页的10条数据),不会出现大 offset 导致的性能骤降,适合深度分页(比如分页到10000页以后);

  • 避免回表:如果查询字段包含在排序索引中(比如索引是 (status, id, create_time)),可以实现覆盖索引,无需回表,进一步提升性能;

  • 数据一致性:在并发写入场景下,只要排序键是唯一且有序的(如自增主键),就不会出现重复或漏数据的问题。

缺点:

  • 不支持随机跳页:无法直接实现"跳到第1000页"的功能,只能通过"上一页、下一页"的方式逐步翻页,适合"加载更多""无限滚动"的场景;

  • 依赖有序排序键:必须有唯一、有序的排序字段(如自增主键、时间戳+id),如果排序字段是无序的(如随机字符串),则无法使用;

  • 边界一致性需注意:如果排序键是时间戳(可能重复),需要结合主键 id 一起作为边界条件(如 WHERE create_time > '2025-11-14' AND id > 1023),避免重复数据。

适用场景:无限滚动列表(如朋友圈、商品列表)、深度分页场景、数据变更频繁但需保证一致性的场景。

2. 子查询定位起点(定位 + 扩展)------ 兼容跳页场景

思路:如果业务必须支持随机跳页(比如后台管理系统的分页控件,需要支持"跳到第N页"),可以用子查询先定位到第 offset 条记录的排序键(如 id),然后用 WHERE 条件过滤掉排序键小于该值的数据,再用 LIMIT 返回当前页的条数。这种方式可以避免一次性扫描 offset + count 条数据,只需要扫描 offset 条数据定位起点,再扫描 count 条数据返回结果。

实战 SQL 示例(查询第10001页,每页10条,offset = 100000):

sql 复制代码
SELECT id, order_no, create_time, status FROM orders

WHERE id >= (

SELECT id FROM orders WHERE status = 'OPEN' ORDER BY id ASC LIMIT 100000, 1

)

ORDER BY id ASC

LIMIT 10;

优化点:子查询只查询排序键 id(索引列),无需回表,定位速度更快;主查询根据 id 过滤,只扫描当前页的10条数据,大幅减少扫描量。

优点:

  • 支持随机跳页:兼容传统分页控件的"跳页"功能,无需修改前端交互;

  • 性能优于直接 OFFSET:避免一次性扫描 offset + count 条数据,尤其是在大 offset 场景下,性能提升明显;

  • 实现简单:在原有分页 SQL 基础上修改即可,无需大幅调整业务逻辑。

缺点:

  • 子查询仍需扫描 offset 条数据:如果 offset 极大(如100万),子查询扫描100万条数据仍会有一定开销,但比直接 OFFSET 更优;

  • 依赖排序键索引:子查询中的排序字段必须有索引,否则子查询会进行全表扫描,性能反而更差;

  • 并发场景仍有一致性问题:本质还是基于页码的分页,数据频繁变更时,可能出现重复或漏数据。

适用场景:后台管理系统、需要支持随机跳页的场景、offset 不是特别大(如10万以内)的场景。

3. 覆盖索引(Covering Index)------ 减少回表开销

思路:覆盖索引是指查询的所有字段(SELECT 后的字段)都包含在索引中,此时 MySQL 无需回表,直接从索引中读取数据即可,大幅减少随机 I/O 开销。结合分页场景,我们可以创建包含"过滤条件+排序字段+查询字段"的联合索引,让分页查询成为覆盖索引查询。

实战 SQL 示例(查询 status 为 OPEN 的订单,分页展示 id、order_no、create_time):

-- 第一步:创建覆盖索引(包含过滤条件 status、排序字段 id、查询字段 order_no、create_time)

CREATE INDEX idx_status_id_order_create ON orders(status, id, order_no, create_time);

-- 第二步:分页查询(无需回表,直接从索引中读取数据)

SELECT id, order_no, create_time FROM orders WHERE status='OPEN' ORDER BY id ASC LIMIT 10 OFFSET 100000;

一键获取完整项目代码

关键说明:创建覆盖索引时,要遵循"最左前缀原则",将过滤条件(status)放在最前面,排序字段(id)放在中间,查询字段(order_no、create_time)放在最后,确保索引能被有效利用。

优点:

  • 大幅提升性能:避免回表操作,减少随机 I/O,尤其是在大数据量分页场景下,性能提升明显;

  • 兼顾排序性能:索引本身是有序的,无需额外排序,避免文件排序和临时表的产生;

  • 适用范围广:可结合 OFFSET 分页或游标分页使用,兼容性强。

缺点:

  • 索引维护成本高:索引越多,写入操作(INSERT、UPDATE、DELETE)的开销越大,因为每次写入都需要更新索引;

  • 无法覆盖所有字段:如果查询字段较多(如10个以上),创建包含所有字段的覆盖索引会导致索引体积过大,反而影响性能;

  • 索引选择需谨慎:需根据实际查询场景设计索引,避免创建无用索引。

适用场景:查询字段固定且较少、分页查询频繁、写入频率不高的场景(如商品列表、用户列表)。

4. 物化分页(缓存/预计算)------ 热点页优化

思路:对于热点分页(如前10页),用户访问频率极高,我们可以将这些页面的查询结果缓存起来(如 Redis、本地缓存),用户再次访问时,直接从缓存中获取数据,无需查询数据库。对于静态数据或变化不频繁的数据(如历史订单、新闻列表),还可以预计算分页结果,存储在缓存或数据库中,定期更新。

实战方案示例(Redis 缓存热点页):

  • 缓存 key 设计:page:orders:status:OPEN:1(表示 status 为 OPEN 的订单,第1页);

  • 缓存 value:将分页查询结果(10条数据)序列化为 JSON 格式存储;

  • 缓存失效策略:设置合理的过期时间(如10分钟),或在数据变更时主动删除对应缓存(如新增、删除订单时,删除对应状态的所有热点页缓存);

  • 降级策略:如果缓存失效或缓存穿透,直接查询数据库,并重新缓存结果。

优点:

  • 性能极高:缓存访问速度远快于数据库查询,能大幅降低数据库压力,提升接口响应速度(从毫秒级优化到微秒级);

  • 降低数据库负载:热点页的访问无需查询数据库,减少数据库的 I/O 和 CPU 开销;

  • 实现简单:借助 Redis 等缓存工具,开发成本低,易于落地。

缺点:

  • 缓存一致性问题:数据变更后,缓存可能与数据库不一致,需要设计合理的失效策略,增加了开发复杂度;

  • 不适合冷页:对于访问频率极低的冷页(如第1000页以后),缓存没有意义,反而浪费缓存空间;

  • 缓存维护成本:需要处理缓存失效、缓存穿透、缓存击穿等问题。

适用场景:热点页(前10-20页)、静态数据、变化不频繁的数据、高并发访问场景。

5. 分区表 / 分表策略 ------ 大数据量终极优化

思路:当单表数据量达到千万级、亿级时,即使使用上述优化方案,分页性能也会受到限制。此时可以采用分区表或分表策略,将大表拆分成多个小表,减少单次查询需要扫描的数据量,间接提升分页性能。

常见方案:

  • 分区表:根据时间、主键范围等维度,将单表分成多个分区(如 orders 表按 create_time 分区,每个分区存储一个月的数据),分页查询时,只需要扫描对应分区的数据,无需扫描全表;

  • 水平分表:将单表按主键哈希、用户 ID 哈希等维度,拆分成多个结构相同的小表(如 orders_1、orders_2、orders_3),分页查询时,根据分表规则定位到具体的小表,再进行分页;

  • 垂直分表:将表中不常用的字段拆分到另一张表(如将 orders 表中的备注、附件等字段拆分到 orders_ext 表),减少主表的数据量,提升查询速度。

优点:

  • 大幅提升查询性能:将大表拆分成小表,单次查询扫描的数据量大幅减少,分页性能显著提升;

  • 便于维护:单个小表的数据量小,备份、恢复、扩容更方便;

  • 支持更大的数据量:突破单表数据量限制,适合亿级、十亿级数据场景。

缺点:

  • 开发复杂度高:需要设计分表/分区规则,修改查询、写入逻辑,适配分表场景;

  • 跨分区/跨表查询复杂:如果分页查询需要跨多个分区/小表,需要额外处理数据聚合、排序等问题;

  • 维护成本高:需要管理多个小表/分区,监控每个分区的状态,处理分区扩容、数据迁移等问题。

适用场景:单表数据量千万级以上、分页查询频繁、性能要求极高的场景(如电商订单表、用户行为日志表)。

6. 使用全文搜索 / 专门的搜索引擎 ------ 复杂场景优化

思路:如果分页场景涉及复杂的搜索条件(如多字段模糊查询、多字段权重排序),MySQL 的分页查询性能会很差,此时可以将检索功能交给专门的搜索引擎(如 Elasticsearch、Solr),数据库仅负责存储原始数据,分页查询时,先从搜索引擎中获取符合条件的主键 id,再到数据库中回表查询完整数据(或直接从搜索引擎中返回所需字段)。

实战流程示例:

  1. 将 orders 表中的数据同步到 Elasticsearch 中,建立合适的索引(如分词索引、权重索引);

  2. 分页查询时,先向 Elasticsearch 发送查询请求,获取当前页的主键 id 列表(如10条 id);

  3. 根据 id 列表到 MySQL 中查询完整的订单数据,返回给客户端;

  4. 如果查询字段可以在 Elasticsearch 中完全获取,可直接从 Elasticsearch 返回数据,无需回表。

优点:

  • 支持复杂查询:能高效处理多字段模糊查询、权重排序、地理位置查询等复杂场景,性能远优于 MySQL;

  • 分页性能稳定:搜索引擎专门针对检索和分页优化,即使大数据量、复杂条件下,分页性能也能保持稳定;

  • 减轻数据库压力:将复杂的检索和分页操作转移到搜索引擎,数据库只负责存储和简单查询。

缺点:

  • 架构复杂度高:需要引入搜索引擎,处理数据同步(MySQL 到 Elasticsearch)、索引维护等问题;

  • 开发成本高:需要学习搜索引擎的使用,修改查询逻辑,适配双存储架构;

  • 数据一致性问题:MySQL 与 Elasticsearch 之间的数据同步存在延迟,可能出现数据不一致的情况。

适用场景:复杂搜索+分页场景(如电商商品搜索、新闻搜索)、多字段权重排序场景、大数据量检索场景。

五、工程实践建议与注意事项

优化方案的选择没有绝对的好坏,只有是否适合当前业务场景。结合实际开发经验,给大家以下6条工程实践建议,帮大家避坑,落地优化方案:

1. 优先使用 Keyset 分页

如果业务场景是"按时间线、按主键顺序翻页"(如朋友圈、商品列表),并且不需要随机跳页,优先选择基于游标的 Keyset 分页。这种方案性能最稳定,落地成本低,还能避免并发场景下的数据一致性问题。

2. 不要 SELECT *,只选必要字段

尽量避免使用 SELECT * 查询所有字段,只选择业务需要的字段,这样更容易实现覆盖索引,减少回表开销。比如查询订单列表,只需要查询 id、order_no、create_time、status 即可,无需查询备注、附件等不常用字段。

3. 为 ORDER BY 字段建索引

分页查询几乎都会用到 ORDER BY 排序,一定要为排序字段建立合适的索引,避免触发文件排序和临时表。如果是多字段排序,要建立联合索引,并且遵循最左前缀原则。

4. 使用 EXPLAIN 分析执行计划

优化分页 SQL 前,一定要用 EXPLAIN 分析执行计划,检测 SQL 是否走索引、是否使用临时表、是否触发文件排序。重点关注 type(访问类型,如 ref、range、ALL)、rows(扫描行数)、Extra(额外信息,如 Using filesort、Using temporary、Using index)。

示例:

EXPLAIN SELECT id, order_no FROM orders WHERE status='OPEN' ORDER BY id LIMIT 10000, 10;

一键获取完整项目代码

如果 Extra 中出现 Using filesort,说明没有利用索引排序,需要优化索引;如果出现 Using temporary,说明需要创建临时表,性能较差;如果出现 Using index,说明使用了覆盖索引,性能最优。

5. 监控慢查询与对热点页做缓存

开启 MySQL 的慢查询日志,监控分页相关的慢查询,及时发现性能问题。对于热点页(前10-20页),一定要做缓存(如 Redis),这是最简单、最有效的短期优化方案,能快速降低数据库压力。

6. 注意并发写入下的数据一致性

如果业务场景中数据频繁变更(插入、删除、更新),使用 Keyset 分页时,建议结合时间戳或快照机制,避免重复或漏数据。比如用 (id, create_time) 作为边界条件,确保即使有数据插入,也能准确定位下一页的起点。

补充示例(结合时间戳的 Keyset 分页):

-- 上一页最后一条数据:id=1023,create_time='2025-11-14 10:00:00'

SELECT id, order_no, create_time, status FROM orders

WHERE status='OPEN' AND (create_time > '2025-11-14 10:00:00' OR (create_time = '2025-11-14 10:00:00' AND id > 1023))

ORDER BY create_time ASC, id ASC LIMIT 10;

一键获取完整项目代码

7. 考虑用户体验,优化分页交互

真正的用户通常不会浏览到极深的页面(比如第100页以后),建议将传统的"页码分页"改为"加载更多"或"无限滚动",结合 Keyset 分页实现,既提升性能,又优化用户体验。同时,

sql 复制代码
SELECT id, order_no, create_time, status FROM orders

WHERE status='OPEN' AND (create_time > '2025-11-14 10:00:00' OR (create_time = '2025-11-14 10:00:00' AND id > 1023))

ORDER BY create_time ASC, id ASC LIMIT 10;

可以限制最大分页页数(如最多显示100页),引导用户使用搜索功能快速定位数据。

六、常见误区

在分页性能优化过程中,很多开发者会陷入以下3个误区,大家一定要避开:

误区1:误以为 OFFSET 是常数成本

很多人觉得"LIMIT 10 OFFSET 1000"和"LIMIT 10 OFFSET 0"的性能差不多,都是返回10条数据。但实际上,OFFSET 越大,数据库扫描的行数越多,性能成本呈线性增长,offset 达到10万、100万时,性能会急剧下降。

误区2:仅靠增加索引就能解决一切

索引确实能提升分页性能,但无法消除"扫描 offset 条数据"的本质问题(除非采用 Keyset 分页)。如果 offset 极大,即使有索引,子查询或直接 OFFSET 仍会扫描大量数据,性能依然很差。同时,过多的索引会增加写入成本,反而影响整体性能。

误区3:忽视并发导致的数据重复/漏失

很多开发者只关注分页性能,却忽略了并发场景下的数据一致性问题。基于页码的分页(LIMIT OFFSET)在数据频繁变更时,很容易出现重复或漏数据的问题,尤其是在高并发场景下,这个问题会更加明显,需要结合 Keyset 分页或快照机制解决。

七、示例对比(伪基准测试)

为了让大家更直观地感受到不同优化方案的性能差异,这里做一个伪基准测试(相同硬件环境、相同数据分布,orders 表200万行,id 为主键索引,status 字段有联合索引):

分页方式 SQL 示例 扫描行数 响应时间(伪数据) 性能评价
普通 OFFSET 分页 LIMIT 10 OFFSET 1999990 2000000行 500ms 极差,不适合深度分页
子查询定位起点 WHERE id >= (SELECT id LIMIT 1999990,1) LIMIT 10 1999991行(子查询)+10行(主查询) 150ms 一般,适合需要跳页的场景
Keyset 分页 WHERE id > 1999990 LIMIT 10 10行 10ms 优秀,适合深度分页
覆盖索引分页 SELECT id,status FROM orders LIMIT 10 OFFSET 1999990 2000000行(索引扫描) 80ms 良好,适合查询字段较少的场景
缓存分页(热点页) 从 Redis 读取第200000页数据 0行(数据库) 1ms 极佳,适合热点页

注意:以上数据为伪基准测试结果,具体数值依赖机器配置、存储类型、索引设计和数据分布,实际项目中需以 EXPLAIN 分析和真实压测为准。

八、结论

MySQL 分页性能优化的核心是"减少不必要的扫描和 I/O 开销",不同场景下的优化方案取舍,需结合业务需求、数据量和性能要求综合判断:

  1. 对于大多数需要深度分页、无需随机跳页的场景(如无限滚动列表),Keyset 分页(基于游标)是首选,性能稳定、落地简单,还能保证数据一致性;

  2. 如果业务必须支持"跳页"或随机访问任一页(如后台管理系统),可以结合子查询定位起点 或采用缓存/物化方法,兼顾性能和交互体验;

  3. 对于查询字段固定、写入频率不高的场景,覆盖索引是性价比很高的优化方案,能大幅减少回表开销;

  4. 当单表数据量达到千万级以上时,需考虑分区表/分表策略,突破单表性能限制;

  5. 对于复杂搜索+分页场景,建议引入专门的搜索引擎,将检索和分页压力转移,提升整体性能。

最后,分页优化不是一蹴而就的,需要结合实际业务场景,通过 EXPLAIN 分析执行计划、监控慢查询、进行真实压测,不断调整优化方案,才能达到最佳的性能效果。希望本文能帮助大家解决 MySQL 分页性能问题,顺利应对面试中的相关提问,也能应用到实际项目中,提升系统性能。

相关推荐
IvorySQL2 小时前
直播预告|PostgreSQL 18.3 x IvorySQL 5.3:开启 AI 数据库新纪元
数据库·postgresql·开源
我要成为嵌入式大佬2 小时前
嵌入式学习找工作第十七天--第二个项目(命令行日记本)
学习
TDengine (老段)2 小时前
TDengine IDMP 组态面板 —— 创建组态
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
SelectDB2 小时前
Apache Doris + SelectDB:定义 AI 时代,实时分析的三大范式
大数据·数据库·数据分析
SelectDB2 小时前
OLAP 无需事务?Apache Doris 如何让实时分析兼具事务保障
大数据·数据库·mysql
代码的奴隶(艾伦·耶格尔)2 小时前
Hbase安装与使用
大数据·数据库·hbase
是梦终空1162 小时前
Python深度学习入门:TensorFlow 2.0/Keras实战
jvm·数据库·python
NineData2 小时前
AI 时代的数据对比:DBA 还需要盯着屏幕看差异吗?
数据库·人工智能·dba·数据库管理工具·数据一致性·数据对比·异构迁移
原来是猿2 小时前
MySQL【基本查询上 - 表的增删改查】
数据库·mysql