MySQL 索引进阶:从失效排查到架构哲学

MySQL 索引进阶:从失效排查到架构哲学

文章目录

    • [MySQL 索引进阶:从失效排查到架构哲学](#MySQL 索引进阶:从失效排查到架构哲学)
      • [📚 课程大纲规划](#📚 课程大纲规划)
  • [📖 第一讲:实战------索引失效与效果排查](#📖 第一讲:实战——索引失效与效果排查)
    • [1. 🚫 使用索引一定有效吗?](#1. 🚫 使用索引一定有效吗?)
      • [🔹 常见失效场景(复习与补充)](#🔹 常见失效场景(复习与补充))
    • [2. 🔍 如何排查索引效果?](#2. 🔍 如何排查索引效果?)
      • [🛠️ 核心工具:EXPLAIN](#🛠️ 核心工具:EXPLAIN)
      • [📊 关键字段解读(面试必考)](#📊 关键字段解读(面试必考))
      • [🧐 排查流程图](#🧐 排查流程图)
    • [💡 面试回答重点](#💡 面试回答重点)
      • [🎓 第一讲小结](#🎓 第一讲小结)
  • [📖 第二讲:权衡------索引数量的艺术](#📖 第二讲:权衡——索引数量的艺术)
    • [1. ❌ 索引数量是否越多越好?](#1. ❌ 索引数量是否越多越好?)
      • [⚖️ 核心矛盾:读 vs 写](#⚖️ 核心矛盾:读 vs 写)
        • [💥 极端场景模拟](#💥 极端场景模拟)
    • [2. 📉 为什么不能无限建索引?(三大代价)](#2. 📉 为什么不能无限建索引?(三大代价))
      • [1️⃣ 写入性能损耗 (Write Amplification)](#1️⃣ 写入性能损耗 (Write Amplification))
      • [2️⃣ 存储空间占用 (Storage Overhead)](#2️⃣ 存储空间占用 (Storage Overhead))
      • [3️⃣ 优化器决策负担 (Optimizer Overhead)](#3️⃣ 优化器决策负担 (Optimizer Overhead))
    • [3. 🛠️ 如何决定建多少索引?(最佳实践)](#3. 🛠️ 如何决定建多少索引?(最佳实践))
      • [✅ 策略一:二八定律](#✅ 策略一:二八定律)
      • [✅ 策略二:利用联合索引"以一当十"](#✅ 策略二:利用联合索引“以一当十”)
      • [✅ 策略三:区分读写场景](#✅ 策略三:区分读写场景)
      • [✅ 策略四:定期清理"僵尸索引"](#✅ 策略四:定期清理“僵尸索引”)
    • [4. 🗣️ 面试回答重点](#4. 🗣️ 面试回答重点)
      • [🎓 第二讲小结](#🎓 第二讲小结)
  • [📖 第三讲:溯源------B+ 树的奥秘与查询全过程](#📖 第三讲:溯源——B+ 树的奥秘与查询全过程)
    • [1. ❓ 灵魂拷问:为什么是 B+ 树?](#1. ❓ 灵魂拷问:为什么是 B+ 树?)
      • [🥊 候选者大比拼](#🥊 候选者大比拼)
        • [💡 核心差异图解:B 树 vs B+ 树](#💡 核心差异图解:B 树 vs B+ 树)
    • [2. 🏃‍♂️ 深度复盘:B+ 树查询数据的全过程](#2. 🏃‍♂️ 深度复盘:B+ 树查询数据的全过程)
      • [🗺️ 物理旅程步骤](#🗺️ 物理旅程步骤)
      • [⚡ 性能分析](#⚡ 性能分析)
    • [3. 🔍 特殊情况:范围查询是如何利用链表的?](#3. 🔍 特殊情况:范围查询是如何利用链表的?)
    • [4. 🗣️ 面试回答重点](#4. 🗣️ 面试回答重点)
      • [🎉 系列大总结:从实战到原理的闭环](#🎉 系列大总结:从实战到原理的闭环)

问题

  1. MySQL 中使用索引一定有效吗?如何排查索引效果?
  2. MySQL 中的索引数量是否越多越好?为什么?
  3. 请详细描述 MySQL 的 B+ 树中查询数据的全过程
  4. 为什么 MySQL 选择使用 B+ 树作为索引结构?

这四个问题非常关键,它们分别触及了 索引的局限性设计权衡底层执行细节 以及 数据结构选型哲学

📚 课程大纲规划

讲次 主题 核心覆盖问题 逻辑目标
第一讲 🕵️‍♂️ 实战:索引失效与效果排查 1. 使用索引一定有效吗?2. 如何排查索引效果? 打破"建了索引就快"的迷思,掌握 EXPLAIN 这一核心调试工具。
第二讲 ⚖️ 权衡:索引数量的艺术 1. 索引数量是否越多越好?为什么? 理解读写性能的博弈,学会在空间、写入速度和查询速度之间找平衡点。
第三讲 🌳 溯源:B+ 树的奥秘与选型 1. B+ 树查询数据的全过程2. 为什么 MySQL 选择 B+ 树? 深入数据结构底层,理解 MySQL 为何能成为关系型数据库的王者。

📖 第一讲:实战------索引失效与效果排查

很多开发者有一个误区:"只要建了索引,查询就会变快。" 大错特错!

在复杂的业务场景和优化器决策下,索引可能完全失效,甚至起到反作用。

1. 🚫 使用索引一定有效吗?

答案:不一定。 甚至有时候,优化器会主动放弃索引而选择全表扫描。

🔹 常见失效场景(复习与补充)

除了上一系列讲到的"最左前缀"、"函数运算"、"类型转换"外,还有以下情况会导致索引"有名无实":

  1. 数据分布不均(优化器认为全表扫描更快)

    • 场景 :某列区分度极低(如 status 只有 0 和 1,且 99% 的数据都是 0)。
    • 现象 :查询 WHERE status = 0
    • 结果 :如果需要回表的数据量超过全表的 20%-30% (阈值视版本和数据量而定),优化器会计算发现:"随机 I/O 回表的成本 > 顺序 I/O 全表扫描的成本",于是直接放弃索引,走全表扫描。
  2. 隐式类型转换

    • 场景 :字段是 VARCHAR,查询时没加引号 WHERE phone = 13800000000
    • 结果:MySQL 会在内部对每一行数据进行类型转换比较,导致索引失效。
  3. 模糊查询通配符在前

    • 场景LIKE '%abc'
    • 结果:B+ 树是有序排列的,前缀模糊无法利用有序性,只能全表扫描。
  4. OR 连接条件陷阱

    • 场景WHERE a = 1 OR b = 2
    • 结果 :如果 b 没有索引,整个查询都会走全表扫描。

2. 🔍 如何排查索引效果?

作为后端大神,你的手里必须有一把"手术刀":EXPLAIN

🛠️ 核心工具:EXPLAIN

在 SQL 语句前加上 EXPLAIN,MySQL 会返回执行计划,而不是真正执行查询。

sql 复制代码
EXPLAIN SELECT * FROM users WHERE name = 'Alice' AND age > 20;

📊 关键字段解读(面试必考)

字段 含义 重点关注值
id 查询序号 越大优先级越高;相同则从上到下执行。
select_type 查询类型 SIMPLE (简单), PRIMARY (主查询), SUBQUERY (子查询)。
table 表名 -
type 访问类型 (最重要!) 性能从好到坏 :✅ system > const > eq_ref > ref > range > index > ❌ ALL (全表扫描)(至少达到 range 级别,否则需优化)
key 实际使用的索引 NULL 表示没用到索引。
key_len 索引使用长度 用于判断联合索引使用了多少列(越短可能用得越少,但需结合字符集计算)。
rows 预估扫描行数 越小越好。
Extra 额外信息 (关键线索) Using index (覆盖索引)✅ Using index condition (ICP 下推)⚠️ Using where (Server 层过滤,可能未充分利用索引)❌ Using temporary (用了临时表,需优化 GROUP BY/ORDER BY)❌ Using filesort (文件排序,未利用索引排序,需优化)

🧐 排查流程图

ALL / index
range / ref / eq_ref / const


Using filesort
Using temporary
Using index
Using index condition
编写 SQL
执行 EXPLAIN
type 字段是什么?
❌ 性能差!检查是否全表扫描
✅ 索引生效
key 字段是否为 NULL?
索引未命中

检查:最左前缀/类型转换/函数运算
优化器主动放弃索引

检查:数据区分度/回表成本过高
Extra 字段内容?
⚠️ 排序未走索引

建议:调整索引顺序覆盖 ORDER BY
⚠️ 使用了临时表

建议:优化 GROUP BY
🚀 完美!覆盖索引
🚀 优秀!触发了 ICP

💡 面试回答重点

"索引并不总是有效的。首先,如果查询条件违反了最左前缀原则、对索引列进行了运算或隐式转换,索引会直接失效。

其次,即使语法正确,如果数据的区分度太低 (例如查询性别),或者需要回表的数据量超过了全表的某个阈值(通常 20%-30%),MySQL 优化器经过成本计算后,可能会认为全表扫描(All)索引扫描 + 随机回表更高效,从而主动放弃索引。

排查方法 主要依靠 EXPLAIN 命令。我会重点关注 type 字段(确保至少是 range 级别,避免 ALL),查看 key 确认实际命中的索引,并分析 Extra 字段。如果出现 Using filesortUsing temporary,说明排序或分组未利用索引,需要进一步优化索引设计。"

🎓 第一讲小结

  1. 索引非万能:区分度低、回表成本高时,优化器会弃用索引。
  2. EXPLAIN 是神器 :重点看 type (访问类型) 和 Extra (额外信息)。
  3. 警惕信号Using filesortUsing temporary 通常是性能瓶颈的信号。

🤔 思考题

既然索引有这么多好处,那我给每个字段都建上索引,是不是就能保证所有查询都走 range 甚至 ref 级别,从而避免全表扫描呢?

👉 显然不行!这引出了我们下一讲的核心矛盾:索引数量的权衡

欢迎来到 第二讲 !这一讲我们将解决一个经典的架构权衡问题:索引数量的边界在哪里?

很多初级开发者认为"索引越多查询越快",但在高并发、大数据量的生产环境中,盲目堆砌索引往往是系统崩溃的元凶


📖 第二讲:权衡------索引数量的艺术

1. ❌ 索引数量是否越多越好?

答案:绝对不是! 🙅‍♂️

索引是一把双刃剑 。它虽然能极大提升读性能(SELECT) ,但会显著拖累写性能(INSERT/UPDATE/DELETE) ,并消耗宝贵的磁盘空间内存资源

⚖️ 核心矛盾:读 vs 写

操作类型 有索引的影响 无索引的影响
SELECT (读) 极快利用 B+ 树快速定位,避免全表扫描。 必须全表扫描,数据量大时不可接受。
INSERT (写) 变慢 每插入一行数据,不仅要存数据,还要维护所有相关索引树 (分裂节点、调整指针)。(索引越多,插入越慢) 较快只需写入数据页,无额外维护开销。
UPDATE (写) 变慢若修改了索引列,需要重新调整索引树结构;若未修改索引列,影响较小但仍需检查。 较快直接修改数据页。
DELETE (写) 变慢 删除数据时,不仅要标记数据删除,还要在所有索引树中删除对应的记录。 较快仅标记数据删除。
💥 极端场景模拟

假设一个表有 10 个索引

  • 执行一次 INSERT:数据库需要在 1 个数据页 + 10 个索引页 上进行写入操作。
  • 如果是高并发写入场景(如订单创建、日志记录),过多的索引会导致:
    1. 锁竞争加剧:维护索引需要加锁,持有锁的时间变长。
    2. 磁盘 I/O 飙升:随机写入增多,磁盘队列堵塞。
    3. 吞吐量下降:QPS(每秒查询率)可能直接腰斩。

2. 📉 为什么不能无限建索引?(三大代价)

1️⃣ 写入性能损耗 (Write Amplification)

这是最直接的代价。

  • 原理 :InnoDB 的索引是 B+ 树。插入数据时,为了保持树的有序性,可能会触发页分裂 (Page Split)。如果有多个索引,每个索引树都可能发生分裂和重组。
  • 结论:索引越多,写放大效应越严重。对于写多读少的表(如流水表、日志表),索引应精简到极致。

2️⃣ 存储空间占用 (Storage Overhead)

  • 原理 :二级索引的叶子节点存储的是 索引列值 + 主键 ID
  • 数据 :通常索引文件大小占数据文件大小的 20% ~ 50%。如果建立了大量宽索引(包含长字符串),磁盘空间会迅速膨胀。
  • 影响:更大的数据文件意味着更少的 Buffer Pool 缓存命中率(因为内存是有限的),导致更多的磁盘 I/O。

3️⃣ 优化器决策负担 (Optimizer Overhead)

  • 原理:当 SQL 执行时,MySQL 优化器会评估所有可用索引的成本,选择最优的一个。
  • 影响:索引过多会增加优化器的分析时间(虽然通常很短,但在极高并发下也是开销),且可能导致优化器"选错"索引(统计信息偏差),反而选了次优路径。

3. 🛠️ 如何决定建多少索引?(最佳实践)

✅ 策略一:二八定律

  • 80% 的查询 往往只集中在 20% 的字段 上。
  • 行动:通过慢查询日志(Slow Query Log)和分析业务场景,只为那 20% 的高频查询字段建立索引。

✅ 策略二:利用联合索引"以一当十"

  • 错误做法 :为 a, b, c 分别建三个单列索引 idx_a, idx_b, idx_c
  • 正确做法 :建立一个联合索引 idx_abc (a, b, c)
    • 它可以支持:WHERE a=..., WHERE a=... AND b=..., WHERE a=... AND b=... AND c=...
    • 收益 :用 1 个索引 满足了 3 种 查询场景,同时减少了写入维护成本。

✅ 策略三:区分读写场景

  • 读多写少(如:商品详情、配置表):可以适当多建索引,甚至建立冗余索引以覆盖复杂查询。
  • 写多读少 (如:支付流水、操作日志):极度克制索引数量。只建主键和极少数核心查询索引。非核心查询走离线分析或 ES。

✅ 策略四:定期清理"僵尸索引"

  • 使用工具(如 pt-index-usage 或 MySQL 5.7+ 的 performance_schema)监控索引使用情况。
  • 如果发现某个索引长期未被 SELECT 使用,但该表写入频繁,果断删除该索引

4. 🗣️ 面试回答重点

"索引数量绝不是越多越好。索引的本质是用空间换时间,用写性能换读性能

主要原因有三点

  1. 写入性能下降 :每次 INSERTUPDATEDELETE 操作,都需要同步维护所有相关的索引树。索引越多,页分裂和磁盘 I/O 的次数越多,写吞吐量会显著降低。
  2. 空间成本:索引占用额外的磁盘空间,且会挤占有限的 Buffer Pool 内存,降低数据页的缓存命中率。
  3. 优化复杂度:过多的索引会增加优化器的选择成本,甚至导致选错执行计划。

设计原则

我们应该遵循'按需建立'的原则。优先使用联合索引来覆盖多个查询场景(利用最左前缀原则),避免重复的单列索引。对于写多读少的表,要严格控制索引数量;对于读多写少的表,可以适当放宽。同时,要定期通过监控工具清理未使用的'僵尸索引'。"


🎓 第二讲小结

  1. 核心权衡:索引提升读速度,但牺牲写速度、空间和内存。
  2. 写放大:每个索引都是写入时的额外负担,N 个索引 = N+1 次写入操作。
  3. 优化策略:多用联合索引,少用单列索引;定期清理无用索引;根据读写比例动态调整。

🤔 思考题

我们讨论了索引的利弊和使用技巧,也知道了 B+ 树是 MySQL 的基石。但是,为什么偏偏是 B+ 树?

  • 为什么不用 哈希表 (Hash)?(查找不是 O(1) 吗?)
  • 为什么不用 二叉搜索树 (BST)红黑树
  • 为什么不用 B 树(注意没有 + 号)?

这背后藏着计算机科学与磁盘 I/O 特性的深刻博弈。

准备好进入 第三讲 了吗?我们将深入底层,彻底解开 B+ 树的选型之谜查询全过程!🌳🔍

欢迎来到 第三讲 ,也是本系列的终极篇!🏆

前两讲我们解决了"怎么用"和"用多少"的问题,这一讲我们将深入计算机科学的底层 ,揭开 MySQL 选择 B+ 树 作为索引结构的根本原因,并完整复盘一次查询在 B+ 树中的物理旅程

理解了这一讲,你就真正懂得了数据库设计的**"第一性原理"**。


📖 第三讲:溯源------B+ 树的奥秘与查询全过程

1. ❓ 灵魂拷问:为什么是 B+ 树?

MySQL (InnoDB) 为什么不选哈希表、二叉树、红黑树或普通的 B 树?

核心原因只有一个:数据库是运行在磁盘上的,而磁盘 I/O 极其昂贵。

所有的数据结构选型,都是为了最大限度地减少磁盘 I/O 次数

🥊 候选者大比拼

数据结构 优点 ❌ 致命缺点 (针对数据库场景) 结论
哈希表 (Hash) 等值查询极快 O(1) 1. 不支持范围查询 (Hash 后无序)。2. 不支持排序。3. 存在哈希冲突,极端情况退化。 ❌ 淘汰(仅适用于 Memory 引擎或特定等值查)
二叉搜索树 (BST) 结构简单 1. 树太高 :数据量大时,树高可能达到几十层。2. I/O 灾难:每层节点若不在内存,每次比较都要读一次磁盘。查询一次需几十次 I/O。 ❌ 淘汰
红黑树 (RB-Tree) 自平衡,高度较低 1. 依然太高 :虽然比 BST 好,但每个节点存 2 个子节点,数据量大时树高依然不可接受。2. 随机 I/O:节点在磁盘上不连续。 ❌ 淘汰
B 树 (B-Tree) 多路平衡,树矮 1. 空间浪费 :非叶子节点也存数据,导致单页能存的索引键变少,树相对 B+ 树略高。2. 范围查询慢:数据分散在所有节点,范围查需中序遍历整棵树,I/O 不连续。 ⚠️ 次优(早期文件系统常用)
B+ 树 (B+ Tree) 完美契合磁盘特性 树更矮 :非叶子只存索引,单页容纳更多键,树高通常仅 3-4 层。✅ 范围查询极快 :所有数据在叶子节点,且通过双向链表 连接,只需找到起点,顺序扫描即可。✅ 稳定性能:所有查询都必须走到叶子节点,性能波动小。 👑 王者
💡 核心差异图解:B 树 vs B+ 树

B+ 树 (B+ Tree)
根: 10 (仅索引)
子: 5 (仅索引)
子: 15 (仅索引)
叶: 5, Data
叶: 8, Data
叶: 15, Data
叶: 20, Data
B 树 (B-Tree)
根: 10, Data
子: 5, Data
子: 15, Data
子: 20, Data

关键结论

  1. 非叶子节点不存数据 :让 B+ 树的非叶子节点能塞进更多的"路标"(索引键),使得树的高度更低(通常 3 层就能存千万级数据)。树越矮 = 磁盘 I/O 越少
  2. 叶子节点连成链表 :这是支持 ORDER BYBETWEEN 范围查询的神器。找到起始点,顺着链表拉取即可,无需回溯树结构。

2. 🏃‍♂️ 深度复盘:B+ 树查询数据的全过程

假设我们要执行:SELECT * FROM users WHERE id = 18

已知:

  • 表数据量:2000 万行。
  • 页大小 (Page Size):16 KB (InnoDB 默认)。
  • 主键 ID:BIGINT (8 字节),指针 6 字节。
  • 树高度:约 3 层。

🗺️ 物理旅程步骤

Step 1: 加载根节点 (Root Page)

  • 数据库启动时,根节点通常常驻内存 (Buffer Pool)。
  • 如果不在内存,发起 第 1 次磁盘 I/O,读取根页到内存。
  • 动作 :在根节点中二分查找。发现 18 大于 10 且小于 30,定位到指向"子节点 B"的指针。

Step 2: 加载中间节点 (Inner Page)

  • 检查"子节点 B"是否在内存。若不在,发起 第 2 次磁盘 I/O
  • 动作 :在中间节点继续二分查找。发现 18 落在 1520 之间,定位到指向"叶子节点 C"的指针。

Step 3: 加载叶子节点 (Leaf Page)

  • 检查"叶子节点 C"是否在内存。若不在,发起 第 3 次磁盘 I/O
  • 动作 :在叶子节点中找到 id = 18 的记录。
    • 如果是聚簇索引 (主键) :叶子节点直接存有完整行数据 (name, age, ...)。直接返回。
    • 如果是二级索引 :叶子节点存有 id=18主键值。拿着主键值去聚簇索引树再走一遍流程(即回表)。

Step 4: 返回结果

  • 将数据返回给 Server 层,最终返回给客户端。

⚡ 性能分析

  • 总 I/O 次数 :理想情况下仅需 3 次 磁盘 I/O。
  • 对比:如果是二叉树,2000 万数据树高约 25 层,可能需要 25 次 I/O。
  • 时间差 :磁盘随机 I/O 耗时约 10ms。
    • B+ 树:30ms。
    • 二叉树:250ms。
    • 相差近 10 倍! 这就是 B+ 树的威力。

3. 🔍 特殊情况:范围查询是如何利用链表的?

假设查询:SELECT * FROM users WHERE id BETWEEN 18 AND 30

  1. 定位起点 :像上面一样,通过 3 次 I/O 找到 id=18 所在的叶子节点。
  2. 链表遍历
    • 在当前叶子节点内顺序读取 18, 19, ... 直到页尾。
    • 通过叶子节点末尾的指针(Next Pointer),直接跳转到下一个相邻的叶子节点(物理上可能不连续,但逻辑上通过指针连接)。
    • 继续读取,直到遇到 id > 30
  3. 优势 :整个过程不需要回溯 到父节点,也不需要重新搜索。所有的叶子节点形成了一个有序的双向链表,使得范围查询变成了顺序 I/O(效率远高于随机 I/O)。

4. 🗣️ 面试回答重点

"MySQL 选择 B+ 树主要是为了优化磁盘 I/O 并支持高效的范围查询

相比其他结构

  1. 对比哈希:B+ 树支持范围查询和排序,而哈希不支持。
  2. 对比二叉树/红黑树 :B+ 树是'多路平衡查找树',单个节点能存储更多键值,使得树的高度极低(千万级数据通常只有 3-4 层)。这意味着查询任何数据最多只需 3-4 次磁盘 I/O,而二叉树可能需要几十次。
  3. 对比 B 树 :B+ 树的非叶子节点不存数据 ,只存索引,这使得单页能容纳更多索引项,树更矮。更重要的是,B+ 树的所有数据都存储在叶子节点 ,且叶子节点之间通过双向链表连接。这使得范围查询(Range Scan)和排序操作极其高效,只需遍历链表即可,无需像 B 树那样进行复杂的中序遍历。

查询过程

从根节点开始,通过二分查找逐层向下定位,通常 3 次 I/O 即可到达叶子节点获取数据。若是范围查询,则利用叶子节点的链表顺序扫描,极大减少了随机 I/O。"


🎉 系列大总结:从实战到原理的闭环

恭喜你!完成了 《MySQL 索引进阶:从失效排查到架构哲学》 的全部三讲!🎓

让我们回顾一下整个知识体系:

  1. 第一讲 (实战) :打破了"索引万能论",学会了用 EXPLAIN 诊断 typekeyExtra,识别全表扫描和文件排序。
  2. 第二讲 (权衡):明白了索引是"空间换时间,写换读"的 trade-off,掌握了联合索引设计和清理僵尸索引的策略。
  3. 第三讲 (原理) :深入底层,理解了 B+ 树如何通过降低树高 减少 I/O,以及叶子节点链表如何赋能范围查询。

🌟 大神进阶之路

现在的你,不再是一个只会 CREATE INDEX 的 CRUD 程序员。

  • 看到慢 SQL,你能想到 EXPLAIN 和失效场景。
  • 设计表结构时,你会权衡读写比例和索引数量。
  • 面对架构师提问,你能从磁盘 I/O 和 B+ 树结构的角度娓娓道来。

这就是系统性思维的力量。希望这个系列能成为你技术生涯中的一块坚实基石!🧱🚀

相关推荐
wuyikeer2 小时前
docker 安装 mysql
mysql·adb·docker
草莓熊Lotso2 小时前
MySQL 索引特性与性能优化全解
android·运维·数据库·c++·mysql·性能优化
大龄烤红薯2 小时前
docker-【容器数据存储位置分析】以Mysql容器为例
mysql·adb·docker
skiy3 小时前
华为HuaweiCloudStack(一)介绍与架构
服务器·华为·架构
ruiang3 小时前
如何在 Ubuntu 22.04 上安装 MySQL
linux·mysql·ubuntu
ZzzZZzzzZZZzzzz…3 小时前
MySQL备份还原方法1---mysqldump
linux·运维·数据库·mysql·还原备份
Wyawsl3 小时前
MySQL高可用集群
数据库·mysql
AI服务老曹3 小时前
异构计算新范式:基于 X86/ARM 的 AI 视频管理平台架构深度解析
arm开发·人工智能·架构
尽兴-3 小时前
MySQL 与 Elasticsearch 数据一致性保障的四大主流方案
数据库·mysql·elasticsearch