MySQL在执行Join操作时,优先使用较小的表作为驱动表(也称为外层表)去连接较大的表(也称为被驱动表或内层表)。这样做的原因是,对于连接操作,通常需要对驱动表进行全表扫描或根据索引进行查找,然后根据连接条件与被驱动表进行匹配。
因此,小表驱动大表速度快的前提是:两个表上根据主/外键建立了索引,这样在根据某一条数据查找B+树时,速度就会大大提高,若没有建立索引,则两个表无论谁当作主表,查找数据的次数都是一样的。
如果先对小表进行操作,那么总的扫描行数和匹配次数会相对较少,从而提高查询的效率。 例如,假设有表 A(小表)和表 B(大表)进行连接,如果以表 A 作为驱动表,那么遍历表 A 的成本相对较低,然后根据连接条件与表 B 进行匹配,效率会更高。
假设我们有两个表 employees
和 departments
,其中 employees
表包含大量的员工信息,而 departments
表只包含少量的部门信息。我们要找出每个员工所在的部门名称。
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 亿次比较。
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 删除。