2

我对 mysql 查询中的 WhERE IN () 条件有一个严重的问题。我正在从两个不超过 10 个字段的表中获取 RESULT。我在两者中都创建了主要字段。

我需要使用 WHERE IN () 来查看可能超过 500 或更长的登录 ID。因此,它创建了一个繁重的查询,并且它获取记录的速度太慢。当 login_in ID 小于 20 左右时,它很好,但当它们超过 50 或 100 或更多时,它变得更慢并且需要很长时间来处理。

所以,我的问题是如何让它快速?我使用了错误的技术吗?我的意思是我应该在 IN() 的地方使用其他东西吗?任何想法将不胜感激。

SELECT subscriber. * , track . * 
FROM track, subscriber 
WHERE track.type =1 AND 
      track.logged_in IN ( 2803, 2806, 54, 54, 64, 383, 833, 2808, 2809, 2810, 56, 2811, 2812, 2813, 2814, 2815, 2816, 2817, 2818, 2819, 2820, 2821, 2822, 2823, 2824, 2825, 2826, 2827, 2828, 2829, 2830, 2831, 2832 ) AND 
      subscriber.post_id = track.post_id AND 
      track.nmade = subscriber.nmade AND 
      subscriber.userid =  '54' 
ORDER BY track.date_created DESC 
LIMIT 5
4

2 回答 2

4

mysql 中的 IN 子句的速度并不出名……也许如果你用你想要的 id 创建一个临时表,并且你用 track 表做一个 JOIN,那么操作会更快。

临时表是每个会话的,因此您无需花费精力在使用后删除它们,当您关闭与 mysql 的连接时,它们将被 mysql 删除。

无论如何,如果您想在 JOIN 操作中获得合理的性能,您将需要索引 logged_in 字段。

于 2012-11-08T15:00:22.877 回答
1

你可以试试这样的,应该会更快。这不是最好的方法,但可能最容易在您的 PHP 中实现。

SELECT subscriber. * , track . * 
FROM track, subscriber
JOIN (
    SELECT 2803 as logged_in
    UNION
    SELECT 2806
    UNION
    SELECT 54
    UNION
    SELECT 64
    ) list
ON track.logged_in = list.logged_in

WHERE track.type =1 AND 
      subscriber.post_id = track.post_id AND 
      track.nmade = subscriber.nmade AND 
      subscriber.userid =  '54' 
ORDER BY track.date_created DESC 
LIMIT 5
于 2012-11-08T15:11:46.627 回答