我在mysql中遇到的问题很少。
我有一个100k +行的表。 table包含字段:userid,id
我需要通过userid获取id
。
userid~30k
我使用了sql:select * from table where userid in (....)
但是当userid~30k + mysql非常慢时...更多10秒
我用临时表解决了这个问题:
1)创建临时表_temp(id int,primary(id
)
2)用userid数据填充表(30k +)
3)选择:
select c.id from _temp t1 left join contacts c on t1.id=c.userid ...
在这种情况下查询运行得更快。 对测试数据0.4s的旧查询 关于测试数据的新查询:0.02s
这是好主意还是你知道更好的优化方法。
PS:userid不是表数据。只是int数组
答案 0 :(得分:0)
一些一般提示:
首先:检查列userid
是否已编入索引。如果不是,请添加索引:
ALTER TABLE yourtable
ADD INDEX idx_userid(userid);
第二:IN
旨在与小型和确定性集合一起使用。考虑一下:对于表中的每一行,IN
条件必须执行一次。如果IN
条件具有少量值,那将非常快,但如果它太大,您将遇到麻烦。如果确实需要使用30k值,不要将它们置于IN
条件下。您的方法很好:创建一个临时表,将值存储在那里,然后加入表。
最后一件事:在创建临时表之后,还要为您要存储要搜索的值的列编制索引;这将使您的查询运行得更快。
答案 1 :(得分:-1)
您可能希望使用存在查询
select * from table where exists (select userid from users where users.userid = table.userid)