JOIN性能不佳的mysql子查询

标签 mysql performance join subquery

我的问题是:

select * from 
    (
    select * from barcodesA 
    UNION ALL 
    select * from barcodesB
    )
    as barcodesTOTAL, boxes
 where barcodesTotal.code=boxes.code;

表格barcodesA有4000个条目 表 barcodesB 有 4000 个条目 表格框有大约 180.000 个条目

处理查询需要 30 秒。

另一个有问题的查询:

select * from 
    viewBarcodesTotal, boxes
 where barcodesTotal.code=boxes.code;

viewBarcodesTotal 包含来自两个条形码表的 UNION ALL。它也需要永远。

同时,

        select * from barcodesA , boxes where barcodesA.code=boxes.code
        UNION ALL 
        select * from barcodesB , boxes where barcodesB.code=boxes.code

这个需要 <1 秒。

问题显然是为什么?我的代码有问题吗? mysql 有问题吗?

我必须从访问权限迁移到 mysql,如果第一个选项出现问题,我将不得不重写我的所有代码。

最佳答案

如果您还没有索引,请在 boxes.code 上添加索引。将 8000 条记录 (4K+4K) 加入 180,000 条记录将受益于等式 180K 一侧的索引。

此外,在您的 SELECT 语句中明确指定您需要的字段。在生产用途查询中使用 * 是一种糟糕的形式,因为它鼓励您不必考虑哪些字段(以及它们可能有多大),更不用说您的示例中有 2 个不同的表,barcodesabarcodesb 可能具有不同的数据类型和您正在联合的列顺序....

关于JOIN性能不佳的mysql子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9049146/

相关文章:

join - Doctrine 2 中的自动 JOIN 生成

mysql - 将新字段添加到预先存在的表中并修改先前在 Rails 中创建的数据

mysql - 合并三张表中的一个表字段为email

mysql - 如何使用空值更新列

php - 如何使用 PHP 和 MySQL 从两个条件链接表中有效地求和和减去

android - 弹出窗口未在 android L 中正确显示

c++ - 决定何时使用哈希表

mysql - 在 Mysql 上连接多个表

mysql - 有人知道可以立即从 sql 脚本使用的 MySQL 综合假数据生成器吗?

sql - 从一个表中选择所有记录并从另一个表中选择引用值?