慢慢在mysql中的位置。

时间:2015-03-12 15:14:59

标签: mysql database

我在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数组

2 个答案:

答案 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)