MySQL 计算多个表中的唯一值

标签 mysql performance

我有两个表:

products            product_eans
+--+-----------+    +----------+-------------+
|id|name       |    |product_id|ean          |
+--+-----------+    +----------+-------------+
| 1|hello world|    |         1|4053804303361|
+--+-----------+    +----------+-------------+
| 2|hello mars |    |         1|4053804304788|
+--+-----------+    +----------+-------------+
                    |         2|4053804304825|
                    +----------+-------------+

我现在想要计算名称或 EAN 之一中包含字符串 4788 的(唯一)产品。示例中的结果将为 1(一种产品的 EAN 包含搜索字符串 4788)

我已经解决了这个问题

SELECT
        COUNT(DISTINCT products.id) AS count
    FROM
        products
    WHERE
        products.name LIKE "%4788%" OR 
        (SELECT
            GROUP_CONCAT(ean)
        FROM
            product_eans
        WHERE
            product_id = product.id) LIKE "%4788%"`

但是两个表中都有数千行,令人难以置信。

像这样的查询最有效的方法是什么?

最佳答案

使用“双端通配符”永远不会很快,因为您不会使用索引,因此将扫描表。内部联接可能是最有效的

SELECT COUNT(DISTINCT e.products_id)
FROM product_eans e
inner join products p on e.products_id = p.id
WHERE e.ean LIKE '%4788%'
OR p.name LIKE '%4788%'

但另一种可能性是通过使用如下联合查询来避免 tha wheer 子句中的 OR:

  SELECT
        COUNT(*)
  FROM (
        SELECT
              product_id
        FROM product_eans
        WHERE ean LIKE '%4788%'
        UNION
        SELECT
              id
        FROM products
        WHERE name LIKE '%4788%'
  ) d

关于MySQL 计算多个表中的唯一值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47481441/

相关文章:

performance - NetLogo 对于大型模拟是否太慢?如何加速 NetLogo 模型?

performance - 为什么 SSE 标量 sqrt(x) 比 rsqrt(x) * x 慢?

mysql - 如何将复杂的 linux 终端命令的输出插入到 mysql 数据库表中

php - MySQL:发送 QUERY 数据包时出错。 PID=2

optimization - Hadoop计数器-调整和优化

javascript - SetTimeout() 导致 cpu 使用率过高

java - 字符串连接是否经过优化以使用现有的 StringBuilders?

php - 这会更新我的sql信息吗?

php - 从 MySQL 中的单个表中查找与给定结果相似的结果

mySQL 如何将多个 JOIN 结果作为唯一列返回?