[求证&散分]MySQL 中 where id in (1,2,3,4,...) 的效率问题讨论

ACMAIN_CHM 2009-06-26 04:36:44
加精
庆祝本月大版得分过万,兼把在这段论坛中经常被问到的一个问题拿出来大家讨论一下。

命题假设:

测试表如下
create table t_06 (
id int not null primary key,
c1 varchar(30),
i2 int
) engine = myisam;

delimiter //

CREATE PROCEDURE prepareData_t_06 ()
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i < 500000 DO
insert into t_06 values (i,concat('AA',i),i);
SET i = i + 1;
END WHILE;
END;
//

delimiter ;

CALL prepareData_t_06();

select count(*) from t_06;
show index from t_06;
show table status like 't_06';




现在如果由程序在数组中提供 100 个 ID 如下
38068,238833,308799,274344,299910,309823,337486,290812,56393,64413,492511,260426,58626,450987,499220,187731,365665,212799,227788,255724,384636,465766,417310,313148,483987,328761,402876,237274,249183,174185,28187,189155,259940,67800,60065,340172,311667,354861,182,305523,115981,365082,213915,47894,131301,198754,358852,112496,404423,486725,233123,322936,325337,125932,299260,128791,295663,469897,120580,347766,34859,364204,37597,268974,351155,256955,214013,309192,412394,216800,30315,411242,16678,233247,359013,401666,30792,452394,408649,14159,5519,91705,227648,120966,319599,351170,68129,368701,233566,144256,156172,41972,499687,390955,6549,298079,498230,196397,239493,242037

如何实现查询效率比较高,请给出你的意思,测试方案和对比结果者加分。

select * from t_06 where id in (38068,238833,308799,274344,299910,309823,337486,290812,56393,64413,492511,260426,58626,450987,499220,187731,365665,212799,227788,255724,384636,465766,417310,313148,483987,328761,402876,237274,249183,174185,28187,189155,259940,67800,60065,340172,311667,354861,182,305523,115981,365082,213915,47894,131301,198754,358852,112496,404423,486725,233123,322936,325337,125932,299260,128791,295663,469897,120580,347766,34859,364204,37597,268974,351155,256955,214013,309192,412394,216800,30315,411242,16678,233247,359013,401666,30792,452394,408649,14159,5519,91705,227648,120966,319599,351170,68129,368701,233566,144256,156172,41972,499687,390955,6549,298079,498230,196397,239493,242037);
...全文
23582 84 打赏 收藏 转发到动态 举报
写回复
用AI写文章
84 条回复
切换为时间正序
请发表友善的回复…
发表回复
ft_2011 2012-10-25
  • 打赏
  • 举报
回复
mark下学习用
hesaer01 2012-08-24
  • 打赏
  • 举报
回复
你的字段建立索引了么?
[Quote=引用 82 楼 的回复:]

那要是同时查询的个数多呢 像这样
。。。。。。。。。。。。。。。。in(1,2,3,4,5,6,7,8,9,10);
。。。。。。。。。。。。。。。。in(12,22,32,42,52,62,72,82,92,102);
。。。。。。。。。。。。。。。。in(11,21,31,41,51,61,7,81,9,10);
。。。。。。。。。。。。。。。。in(13,2,3,4,53,6,7,……
[/Quote]
阿里路西亚 2012-06-20
  • 打赏
  • 举报
回复
那要是同时查询的个数多呢 像这样
。。。。。。。。。。。。。。。。in(1,2,3,4,5,6,7,8,9,10);
。。。。。。。。。。。。。。。。in(12,22,32,42,52,62,72,82,92,102);
。。。。。。。。。。。。。。。。in(11,21,31,41,51,61,7,81,9,10);
。。。。。。。。。。。。。。。。in(13,2,3,4,53,6,7,8,9,10);
。。。。。。。。。。。。。。。。in(1,2,32,4,5,6,74,84,9,10);
。。。。。。。。。。。。。。。。in(15,25,3,4,5,6,7,8,69,10);
我这儿使用后的结果,效率很慢,慢慢的jsp页面就卡死了
这个问题怎么解决 用什么可以替换in
csdncb 2012-05-15
  • 打赏
  • 举报
回复
测试结果:近30W条数据,in(小于100个的主键),响应时间在毫秒级。
  • 打赏
  • 举报
回复
到20W个ID,in就吃不消了,5W以内没问题,10W的话,in会比left join慢
kitewell 2011-12-21
  • 打赏
  • 举报
回复
我想知道in里多于多少个id了,需要换成join

希望下次搜到的时候,有人回答了。
黄袍披身 2011-12-12
  • 打赏
  • 举报
回复
不小心发了个月经贴...以后多来此地撒尿...
jsnjmayang 2011-11-03
  • 打赏
  • 举报
回复
咋没下文了啊。这就算结贴了吗? 有人测试好了,出结果了吗??
For_Ning 2011-09-06
  • 打赏
  • 举报
回复
好贴啊,这种讨论贴多有意义啊
学习学习
garykiller 2011-06-27
  • 打赏
  • 举报
回复
mark
a3580737 2011-06-20
  • 打赏
  • 举报
回复
帮顶!!!!!!!!!!!!
edwinboyan 2011-02-26
  • 打赏
  • 举报
回复
好帖!

csdn这种贴多一些的话会感觉很好。
fengyqf 2011-01-20
  • 打赏
  • 举报
回复
[Quote=引用 63 楼 vga 的回复:]

如果我的in里有5W个Id或更多,结果会怎样呢?

用 join
[/Quote]

同意
化蝶自在飞 2011-01-05
  • 打赏
  • 举报
回复
in ,吼吼.更倾向于用原生的方法来解决.
popviv 2010-12-17
  • 打赏
  • 举报
回复
顶一下,我比较喜欢用in。把贴顶起来,大家汇总下经验
vga 2010-12-10
  • 打赏
  • 举报
回复
如果我的in里有5W个Id或更多,结果会怎样呢?

用 join
沉沦 2010-07-09
  • 打赏
  • 举报
回复
mark
wubai250 2010-06-30
  • 打赏
  • 举报
回复
我也想知道,目前也遇到了同样的问题,如果我的in里有5W个Id或更多,结果会怎样呢。
shrimpma 2010-06-24
  • 打赏
  • 举报
回复
学习了,没想到有这么的方法
dong308 2010-04-02
  • 打赏
  • 举报
回复
楼上的牛X了.学习中.接分来了.
加载更多回复(58)

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧