【问题标题】:Mysql Query getting slower due to IN clause. Any possible alternatives?由于 IN 子句,Mysql 查询变慢。任何可能的替代方案?
【发布时间】:2015-02-11 14:54:41
【问题描述】:

我有 2 个 mysql 表 "store (id,name,imageurl)" 和 "favorites(person,storeid)" 。

一切正常。但随着数据的增加,它变得越来越慢。我认为这主要是由于查询中的“IN”。有什么方法可以让这个查询在执行时更加智能?

SELECT id,name,imageurl FROM store WHERE id IN 
(SELECT storeid FROM favorites WHERE person='rhino' AND storeid>100000)

提前致谢。

【问题讨论】:

    标签: php mysql database mysqli


    【解决方案1】:

    使用连接语法。这里不需要子查询

    SELECT store.id, store.name, store.imageurl
      FROM store
      JOIN favorites ON store.id = favorites.storeid
      WHERE favorites.person = 'rhino' AND store.id > 100000
    

    您应该使用EXPLAIN 来了解您的查询性能。

    【讨论】:

    • 感谢@tadman 的编辑。解释的参考是他加的
    【解决方案2】:

    这是另一种方法

    看起来您可以直接查找而不是 IN。像这样的:

    SELECT s.id, s.name, s.imageurl 
    FROM store s, favorites f 
    WHERE f.person='rhino' AND f.storeid>100000 AND f.storeid=s.id
    

    这种方法避免了JOIN,这也可能很昂贵。

    【讨论】:

    • 谢谢。它的工作速度超级快,对我来说真的很聪明。 ;)
    【解决方案3】:
    SELECT 
    store.id,
    store.name,
    store.imageurl
    
    FROM store
    INNER JOIN favorites
        ON store.id = favorites.storeid
        AND favorites.person = 'rhino'
    
    WHERE store.id > 100000
    

    它基本上是关于优化查询 - 在这种情况下,JOIN 比嵌套选择更好。

    您可能还需要确保在 favorites.storeidfavorites.person 上拥有 INDEX,因为它们具有 JOIN 和 WHERE 条件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-08
      相关资源
      最近更新 更多