前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >数据库优化——小表驱动大表的原理分析

数据库优化——小表驱动大表的原理分析

原创
作者头像
绿水长流z
修改2025-01-25 11:32:12
修改2025-01-25 11:32:12
18200
代码可运行
举报
文章被收录于专栏:数据库数据库
运行总次数:0
代码可运行

3.1.2 小表驱动大表原则

MySQL在执行Join操作时,优先使用较小的表作为驱动表(也称为外层表)去连接较大的表(也称为被驱动表或内层表)。这样做的原因是,对于连接操作,通常需要对驱动表进行全表扫描或根据索引进行查找,然后根据连接条件与被驱动表进行匹配

  • 没有索引的情况下:
  • 有用到索引的情况:

因此,小表驱动大表速度快的前提是:两个表上根据主/外键建立了索引,这样在根据某一条数据查找B+树时,速度就会大大提高,若没有建立索引,则两个表无论谁当作主表,查找数据的次数都是一样的。

如果先对小表进行操作,那么总的扫描行数和匹配次数会相对较少,从而提高查询的效率。 例如,假设有表 A(小表)和表 B(大表)进行连接,如果以表 A 作为驱动表,那么遍历表 A 的成本相对较低,然后根据连接条件与表 B 进行匹配,效率会更高。

假设我们有两个表 employeesdepartments,其中 employees 表包含大量的员工信息,而 departments 表只包含少量的部门信息。我们要找出每个员工所在的部门名称。

  • 大表驱动小表伪代码:
代码语言:javascript
代码运行次数:0
复制
FOR each row e IN employees // 假设employees有100万行
    FOR each row d IN departments // 假设departments有100行
        IF e.department_id == d.id THEN
            OUTPUT (e.name, d.name)

这里,外层循环会执行 100 万次,每次都要遍历 departments 表中的 100 行,总共需要 100 万 * 100 = 1 亿次比较。

  • 小表驱动大表伪代码:
代码语言:javascript
代码运行次数:0
复制
FOR each row d IN departments // 只有100行
    LOOKUP rows FROM employees USING idx_department WHERE department_id = d.id // 使用索引查找
    FOR each matching row e IN lookup_result
        OUTPUT (e.name, d.name)

这里,外层循环只执行 100 次,每次遍历 employees 表中的 100 万行。虽然内层循环的次数看起来很多,但如果 employees.department_id 上有索引,每次查找都可以非常快,且外层循环的次数大大减少。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 3.1.2 小表驱动大表原则
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档