【问题标题】:MySQL IN clause is too slow, cannot get JOIN to work properlyMySQL IN 子句太慢,无法让 JOIN 正常工作
【发布时间】:2014-04-06 20:27:58
【问题描述】:

我有一个小问题,我无法解决问题。

这个查询完全符合我的需要,只是它需要永远并且只会杀死 mysql 守护进程。

"SELECT * 
 FROM inventory 
 WHERE 
    mac LIKE '%".$s."%' 
    OR uid IN (SELECT id FROM clients WHERE username LIKE '%".$s."%')"

正确的方法是使用 JOIN 子句,但不幸的是我无法让它工作。

基本上,我正在尝试搜索两个表,然后根据 mac-address 或用户名选择记录。

任何帮助将不胜感激!

【问题讨论】:

  • “%anything”也是性能杀手
  • @Strawberry: ...以及OR
  • 其他栏目不能搜索吗?有时我会创建额外的人工列来帮助搜索。
  • 您的JOIN 尝试是什么样的?另外,您为什么不知道您要查找的不同用户名或 mac 地址?
  • @PreetSangha 索引将在使用 LIKE % 时不起作用。

标签: mysql join search sql-like multiple-tables


【解决方案1】:

这是一种方法:

"SELECT i.*
   FROM inventory i
   LEFT
   JOIN ( SELECT c.id
            FROM clients c
           WHERE c.username LIKE '%".$s."%'
           GROUP BY c.id
        ) v
     ON v.id = i.uid
  WHERE i.mac LIKE '%".$s."%'
     OR v.id IS NOT NULL"

这应该比为清单表中的每一行重新执行 IN(子查询)效率更高。但该查询仍然存在问题,因为它必须对inventoryclients 表中的每一行进行全面扫描。

【讨论】:

  • 这很好用!不幸的是,我还不能投票...非常感谢!
【解决方案2】:
 SELECT inventory.* 
 FROM inventory LEFT JOIN clients ON (inventory.uid=clients.id)
 WHERE 
    mac LIKE '%".$s."%' OR username LIKE '%".$s."%'

【讨论】:

  • 只是几个注释;在 OP 查询中,它只返回来自inventory 的列;此查询返回来自inventoryclients 表的列。此外,如果clients 中有不止一行与inventory.uid 匹配,这将从`inventory.xml 中返回“重复”行。 (OP 查询不这样做。)在主键(或其他一组唯一的非空列)上添加 GROUP BY 将消除生成的重复项。
  • uidclients 表的主键id 的外键。作为主键,它根据定义是唯一的,所以没有问题。
  • 我完全错过了id列被定义为inventory的主键。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多