我在mysql查询中遇到WHERE IN()条件的严重问题。我从两个不超过10个字段的表中获取RESULT。我在两者中创建了主要字段。
我需要使用WHERE IN()来查看可能超过500或更长的logged_in 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
答案 0 :(得分:5)
mysql中的IN子句并不以它的速度而闻名......也许如果你创建一个具有你想要的id的时态表,你用跟踪表进行JOIN操作会更快。
temporaries表是每个会话,因此您不需要花费精力在使用后删除它们,当您关闭与mysql的连接时,它们将被mysql删除。
无论如何,如果你想在JOIN操作中有合理的性能,你需要索引logged_in字段。
答案 1 :(得分: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