MySQL

ACMAIN_CHM06-26 16:36
等级 84次回复

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

庆祝本月大版得分过万,兼把在这段论坛中经常被问到的一个问题拿出来大家讨论一下。

命题假设:

测试表如下

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);

 
wangxuantest06-26 16:43
等级


1楼

支持楼主  呵呵  有才人啊

liangCK06-26 16:55
等级


2楼

先接个分..再看.

apple_818006-26 16:56
等级


3楼

将100已知ID写入一个临时表,然后用联结试试

Conry06-26 16:56
等级


4楼

引用 2 楼 liangCK 的回复:

先接个分..再看.

up

netxuning06-26 16:59
等级


5楼

支持

liangCK06-26 16:59
等级


6楼

我认为分两步.
先将提供的ID转成行集.
ID
-----
38068
238833
308799
..

然后与表做JOIN操作.

apple_818006-26 17:05
等级


7楼

引用 6 楼 liangCK 的回复:

我认为分两步. 
先将提供的ID转成行集. 
ID 
----- 
38068 
238833 
308799 
..

然后与表做JOIN操作.

我3楼就是这个意思。

实际还要对比 Join 和 In 在本例中那个效率高

WWWWA06-26 17:11
等级


8楼

1、
直接用IN

select * from  t_06 a inner join lsbtest b on a.id=b.id1;

2、用LSBTEST

DROP TABLE IF EXISTS `lsbtest`;
CREATE TABLE `lsbtest` (
  `id1` bigint(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

/*Data for the table `lsbtest` */

LOCK TABLES `lsbtest` WRITE;

insert  into `lsbtest`(`id1`) values (1),(2),(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);

UNLOCK TABLES;

select * from  t_06 a inner join lsbtest b on a.id=b.id1;

WWWWA06-26 17:21
等级


9楼

1、
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);

(100 row(s) returned)
Execution Time : 00:00:00:000
Transfer Time  : 00:00:00:000
Total Time     : 00:00:00:000

2、
select * from  t_06 a inner join lsbtest b on a.id=b.id1;
lsbtest:没有索引

(102 row(s) returned)
Execution Time : 00:00:00:000
Transfer Time  : 00:00:00:000
Total Time     : 00:00:00:000

如果直接运行1、2则两者在速度上基本相近

但2如果加上建表、插入数据,则
DROP TABLE IF EXISTS `lsbtest`; 
CREATE TABLE `lsbtest` ( 
  `id1` bigint(10) DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

/*Data for the table `lsbtest` */

insert  into `lsbtest`(`id1`) values (1),(2),(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 a inner join lsbtest b on a.id=b.id1;

Total Time     : 00:00:01:094
Total Time     : 00:00:00:250
Total Time     : 00:00:00:015

大约1.359秒

lastyang06-26 18:10
等级


10楼

帮顶

nettman06-26 18:10
等级


11楼

友情UP!

LongYongkai06-26 21:28
等级


12楼

UP

kaifaye06-27 02:01
等级


13楼

看看~~~~~~

why_java06-27 08:48
等级


14楼

UP 学习了

yhjhoo06-27 11:19
等级


15楼

引用 8 楼 WWWWA 的回复:

1、
直接用IN

select * from  t_06 a inner join lsbtest b on a.id=b.id1;

2、用LSBTEST

DROP TABLE IF EXISTS `lsbtest`;
CREATE TABLE `lsbtest` (
`id1` bigint(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

/*Data for the table `lsbtest` */

LOCK TABLES `lsbtest` WRITE;

insert  into `lsbtest`(`id1`) values (1),(2),(38068),(238833),(308799),(274344),(299910),(309823),(337…

感觉还是把这些数据放到一张表里面好

bllizard06-27 12:18
等级


16楼

把这个放到一个INDEX中,可以吗?
比如:
create index index_id on yourtable (id)

xuronghua500006-27 12:47
等级


17楼

学习了

LIXG42506-27 17:15
等级


18楼

jie fen ...

wangchaozhong06-27 17:36
等级


19楼

学习加接分

josy06-27 20:00
等级


20楼

用临时表的话,应该把创建临时表和删除临时表的时间算上
试试这个不创建表的方法(没有环境测试,不知道性能如何):

select 
  a.* 
from 
  t_06 as a
inner join 
  (select 38068 as id
   union all select 238833   union all select 308799 
   union all select 274344 
   union all select 299910 
   union all select 309823 
   union all select 337486 
   union all select 290812 
   union all select 56393 
   union all select 64413 
   union all select 492511 
   union all select 260426 
   union all select 58626 
   union all select 450987 
   union all select 499220 
   union all select 187731 
   union all select 365665 
   union all select 212799 
   union all select 227788 
   union all select 255724 
   union all select 384636 
   union all select 465766 
   union all select 417310 
   union all select 313148 
   union all select 483987 
   union all select 328761 
   union all select 402876 
   union all select 237274 
   union all select 249183 
   union all select 174185 
   union all select 28187 
   union all select 189155 
   union all select 259940 
   union all select 67800 
   union all select 60065 
   union all select 340172 
   union all select 311667 
   union all select 354861 
   union all select 182 
   union all select 305523 
   union all select 115981 
   union all select 365082 
   union all select 213915 
   union all select 47894 
   union all select 131301 
   union all select 198754 
   union all select 358852 
   union all select 112496 
   union all select 404423 
   union all select 486725 
   union all select 233123 
   union all select 322936 
   union all select 325337 
   union all select 125932 
   union all select 299260 
   union all select 128791 
   union all select 295663 
   union all select 469897 
   union all select 120580 
   union all select 347766 
   union all select 34859 
   union all select 364204 
   union all select 37597 
   union all select 268974 
   union all select 351155 
   union all select 256955 
   union all select 214013 
   union all select 309192 
   union all select 412394 
   union all select 216800 
   union all select 30315 
   union all select 411242 
   union all select 16678 
   union all select 233247 
   union all select 359013 
   union all select 401666 
   union all select 30792 
   union all select 452394 
   union all select 408649 
   union all select 14159 
   union all select 5519 
   union all select 91705 
   union all select 227648 
   union all select 120966 
   union all select 319599 
   union all select 351170 
   union all select 68129 
   union all select 368701 
   union all select 233566 
   union all select 144256 
   union all select 156172 
   union all select 41972 
   union all select 499687 
   union all select 390955 
   union all select 6549 
   union all select 298079 
   union all select 498230 
   union all select 196397 
   union all select 239493 
   union all select 242037
  ) as b
on
  a.id=b.id
WWWWA06-29 10:04
等级


21楼

临时表:
DELIMITER $$

DROP PROCEDURE IF EXISTS `zz`.`cxzfnewa`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `cxzfnewa`(i varchar(5000))
BEGIN
DECLARE ai INT DEFAULT 1;
DROP TABLE IF EXISTS `t_06`; 
create table t_06 (
    id    int not null primary key,
    c1    varchar(30),
    i2    int
) engine = myisam; 
    WHILE ai < 500000 DO
        insert into t_06 values (ai,concat('AA',ai),ai);
        SET ai = ai + 1;
    END WHILE;
DROP TABLE IF EXISTS `lsb2`; 
CREATE TABLE `lsb2` ( 
  `id` bigint(10) DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
set ai=1;
while ai<=1000 do
insert into lsb2 values (ai);
set ai=ai+1;
end while;
DROP TABLE IF EXISTS `lsbtest`; 
CREATE TABLE `lsbtest` ( 
  `id1` bigint(10) DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
insert into lsbtest
select 
mid(mid(i,id,length(i)),2,LOCATE(',',mid(i,id,length(i)),2)-2)
from lsb2 where length(i)>=id and mid(i,id,1)=',' 
and length(mid(i,id,length(i)))>=2;
select * from  t_06 a inner join lsbtest b on a.id=b.id1;
    END$$

DELIMITER ;

Total Time     : 00:00:47:719

WWWWA06-29 10:17
等级


22楼

上一个调用:
call cfzfnew(',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,');
show warnings;

IN方法:
call cfzxin('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');
show warnings;
Total Time     : 00:00:18:234

DELIMITER $$

DROP PROCEDURE IF EXISTS `zz`.`cfzxin`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `cfzxin`(i varchar(8000))
BEGIN
DECLARE ai INT DEFAULT 1; 
DROP TABLE IF EXISTS `t_06`; 
create table t_06 ( 
    id    int not null primary key, 
    c1    varchar(30), 
    i2    int 
) engine = myisam; 
    WHILE ai < 500000 DO 
        insert into t_06 values (ai,concat('AA',ai),ai); 
        SET ai = ai + 1; 
    END WHILE;
set @qq=concat('select * from t_06 where id in(',i,')');
select @qq;
prepare dd from @qq;
execute dd;
    END$$

DELIMITER ;

WWWWA06-29 10:52
等级


23楼

用临时表方法,去掉生成LSB2(即生成1-1000数字的代码),加入主键

Total Time     : 00:00:18:438

DELIMITER $$

DROP PROCEDURE IF EXISTS `zz`.`cfzfnewa`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `cfzfnewa`(i varchar(5000))
BEGIN
DECLARE ai INT DEFAULT 1; 
DROP TABLE IF EXISTS `t_06`; 
create table t_06 ( 
    id    int not null primary key, 
    c1    varchar(30), 
    i2    int 
) engine = myisam; 
    WHILE ai < 500000 DO 
        insert into t_06 values (ai,concat('AA',ai),ai); 
        SET ai = ai + 1; 
    END WHILE;

DROP TABLE IF EXISTS `lsbtest`; 
CREATE TABLE `lsbtest` ( 
  `id1` bigint(10) primary key 
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into lsbtest 
select 
mid(mid(i,id,length(i)),2,LOCATE(',',mid(i,id,length(i)),2)-2) 
from lsb2 where length(i)>=id and mid(i,id,1)=',' 
and length(mid(i,id,length(i)))>=2; 
select a.* from  t_06 a inner join lsbtest b on a.id=b.id1;
    END$$

DELIMITER ;

与IN方法时间相差不多。

claro06-29 11:12
等级


24楼

引用 2 楼 liangCK 的回复:

先接个分..再看.

hkz031806-29 13:43
等级


25楼


学习ing

vinsonshen06-29 16:08
等级


26楼

引用 23 楼 WWWWA 的回复:

用临时表方法,去掉生成LSB2(即生成1-1000数字的代码),加入主键

insert into lsbtest 
select 
mid(mid(i,id,length(i)),2,LOCATE(',',mid(i,id,length(i)),2)-2) 
from lsb2 where length(i)>=id and mid(i,id,1)=',' 
and length(mid(i,id,length(i)))>=2;

妙!

我的看法是:如果前面要查询的源表的数据量很大时,则把in这部分放进临时表并建立索引来关联的速度是最快的(当然源查询表对应字段也有索引),如果要把
查询动态化的话,我的看法跟WWWWA 一样,就是用存储过程的方式,把in那部分的值清单作为参数传进去,若in的清单比较多,则在存储过程内部的最后
对临时表进行人工处理(先truncate,再drop)。

其实这种需求,关键还要看源查询表的数据量及in的值清单的数据量。

wwwwb06-29 16:10
等级


27楼

引用 26 楼 vinsonshen 的回复:

引用 23 楼 WWWWA 的回复: 
 用临时表方法,去掉生成LSB2(即生成1-1000数字的代码),加入主键  
  
 insert into lsbtest  
 select  
 mid(mid(i,id,length(i)),2,LOCATE(',',mid(i,id,length(i)),2)-2)  
 from lsb2 where length(i)>=id and mid(i,id,1)=','  
 and length(mid(i,id,length(i)))>=2;  
  
  
 妙! 
  
 我的看法是:如果前面要查询的源表的数据量很大时,则把in这部分放进临时表并建立索引来关联的速度是…

对,我倾向于用临时表方法,除效率外,还有个人的习惯,呵呵。

sciland06-30 08:56
等级


28楼

先把100个数组放入一张临时表中,利用存储过程进行量表的联合查询

jichangh198307-01 17:39
等级


29楼

没怎么看懂,不过,有学到东西,还要谢谢楼主今天的帮忙,顶一下!

duxianghe07-03 17:36
等级


30楼

我认为直接用In 是最快的。

zgycsmb07-04 11:33
等级


31楼

jf

code_killer07-04 23:27
等级


32楼

引用 30 楼 duxianghe 的回复:

我认为直接用In 是最快的。

我也是这么想的

zf21307-06 10:11
等级


33楼

学习一下

MSTOP07-08 21:45
等级


34楼

我习惯是这样,放哈稀表里,然后 INNER JOIN .

yueliangdao060807-09 11:09
等级


35楼

其实在特大的高压下,你会发现IN的效率很高!

最近在帮客户解决了一个问题,就是把自己内部的临时表直接转成IN了。能够承受的压力更大!

wwwwb07-09 11:13
等级


36楼

引用 35 楼 yueliangdao0608 的回复:

其实在特大的高压下,你会发现IN的效率很高! 
  
 最近在帮客户解决了一个问题,就是把自己内部的临时表直接转成IN了。能够承受的压力更大!

版主测试过没有,数据量多大时,IN的效率>临时表?谢谢

vinsonshen07-09 11:43
等级


37楼

引用 35 楼 yueliangdao0608 的回复:

其实在特大的高压下,你会发现IN的效率很高!

最近在帮客户解决了一个问题,就是把自己内部的临时表直接转成IN了。能够承受的压力更大!

你的源表的数据量多大?

vinsonshen07-09 11:45
等级


38楼

如果你数据量比较少,那可能in的效率比临时表还要快了
其实想下就知道,少了索引扫描、临时表的IO部分、磁头的移动臂减少等等方面。

MSTOP07-09 16:10
等级


39楼

引用 35 楼 yueliangdao0608 的回复:

其实在特大的高压下,你会发现IN的效率很高!

最近在帮客户解决了一个问题,就是把自己内部的临时表直接转成IN了。能够承受的压力更大!

这也有可能. IN ( ...... ) 经MYSQL优化后可能变成有序的内存表或数组了.

ACMAIN_CHM07-09 16:16
等级


40楼

从8楼,9楼的试验结果上,似乎还看不出 mysql 用临时表做 join 会比 直接 IN 有效率上的提高。

各位可以在其它数据库上试试

ACMAIN_CHM07-09 21:34
等级


41楼

个人总结一下以上的方法有:

1。 直接使用 IN (38068,238833,308799 ... )
2。 将 (38068,238833,308799 ... ) 放入临时表,然后用 JOIN
3。 直接在程序中 执行多个 select * where id = 38068; select * from where id=238833; ...
4。 使用 inner join (select 38068 union all select 238833 union all ... )

bllizard07-10 14:26
等级


42楼

为什么用index就不行咧?

liulcster07-10 17:11
等级


43楼

学习一下

hardwin07-13 22:18
等级


44楼

支持楼主!学习了~~~
我一般用in

huolin07-14 15:51
等级


45楼

关注此帖子,也遇到这个问题
目前是直接用的in的,源数据表有20万数据,in后面的数字有一百多个,感觉有些吃不清,建临时表并join没有试过

wt321676707-14 17:03
等级


46楼

学习一下

bigfoot00107-15 08:43
等级


47楼

UP

flairsky07-15 11:29
等级


48楼

围观,支持in

yueliangdao060807-15 16:23
等级


49楼

引用 41 楼 ACMAIN_CHM 的回复:

个人总结一下以上的方法有:

1。 直接使用 IN (38068,238833,308799 ... )
2。 将 (38068,238833,308799 ... ) 放入临时表,然后用 JOIN
3。 直接在程序中 执行多个 select * where id = 38068; select * from where id=238833; ...
4。 使用 inner join (select 38068 union all select 238833 union all ... )

方法很对。
不过效率就第一种高,其他的反而更低。
除非针对特定的业务,这样,其他的方法有可能比第一种效率高!

ljf_ljf07-15 18:50
等级


50楼

1 觉得楼主要这种测试比较意义不太大,不同数据分布查询速度会有一点点不同。

2 在MySQL 中,应该只有 in 和 join 表之间比较。

3 join 表比较多的时候会比 in 慢,因为 in 是在 buffer 中寻找对应内容;
  直接使用 【fill_record】函数就完成;join 是需要创建临时表的额外消耗。

cxyy_07-16 15:46
等级


51楼

又学习了

dawnco08-25 11:53
等级


52楼

学习了

zhoupuyue09-03 13:06
等级


53楼

nianzhang74709-03 13:48
等级


54楼

版主 还没结贴呢

不过还有人把这找出来 也挺狠的

denniswwh09-03 14:22
等级


55楼

既然挖出来了,我也来接分

Comgarden09-03 14:30
等级


56楼

mark

zuoxingyu03-31 02:18
等级


57楼

MARK

fuyongjie04-01 11:14
等级


58楼

越到后边越越倾向用in了,呵呵

dong30804-02 18:21
等级


59楼

楼上的牛X了.学习中.接分来了.

shrimpma06-24 08:54
等级


60楼

学习了,没想到有这么的方法

wubai25006-30 09:41
等级


61楼

我也想知道,目前也遇到了同样的问题,如果我的in里有5W个Id或更多,结果会怎样呢。

m58244567207-09 17:51
等级


62楼

mark

vga12-10 07:34
等级


63楼

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

用 join

popviv12-17 00:49
等级


67楼

顶一下,我比较喜欢用in。把贴顶起来,大家汇总下经验

tuzwu01-05 23:23
等级


68楼

in ,吼吼.更倾向于用原生的方法来解决.

fengyqf01-20 11:54
等级


69楼

引用 63 楼 vga 的回复:

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

用 join

同意

edwinboyan02-26 12:21
等级


70楼

好帖!

csdn这种贴多一些的话会感觉很好。

a358073706-20 17:10
等级


72楼

帮顶!!!!!!!!!!!!

garykiller06-27 15:18
等级


73楼

mark

kxn30809-06 15:51
等级


74楼

好贴啊,这种讨论贴多有意义啊
学习学习

jsnjmayang11-03 09:03
等级


75楼

咋没下文了啊。这就算结贴了吗?   有人测试好了,出结果了吗??

PhpNewnew12-12 20:36
等级


76楼

不小心发了个月经贴...以后多来此地撒尿...

kitewell12-21 10:34
等级


77楼

我想知道in里多于多少个id了,需要换成join

希望下次搜到的时候,有人回答了。

a43591100404-26 15:23
等级


79楼

到20W个ID,in就吃不消了,5W以内没问题,10W的话,in会比left join慢

csdncb05-15 07:56
等级


81楼

测试结果:近30W条数据,in(小于100个的主键),响应时间在毫秒级。

rrttyyui06-20 14:20
等级


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,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

hesaer0108-24 10:53
等级


83楼

你的字段建立索引了么?

引用 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,……

ft_201110-25 09:12
等级


84楼

mark下学习用

0

0

回复

分享

即使是一小步
也想与你分享
©1999-2012, csdn.net, All Rights Reserved

MySQL 中 where id in (1,2,3,4,...) 的效率问题讨论的更多相关文章

  1. mysql中or和in,in和exists的效率问题

     mysql中or和in的效率问题      在网上一直看到的是or和in的效率没啥区别,一直也感觉是这样,前几天刚好在看<mysql数据库开发的36条军规>的文章,里面提到了or和in的 ...

  2. MySQL中你肯定不知道的int隐情

    MySQL中定义id字段为int类型,但是你知道它内部是什么玩意吗? 1.如果定义int类型,但是不声明长度,系统默认为11个长度(这个大家都知道): 2.如果指定长度小于11,实际上系统还是默认为1 ...

  3. mysql select *... where id in (select 字符串 from ... )查询结果问题?

    SQL中的写法为 ); 查询结果为: id TypeName 1 新手 2 手机 在MYSQL中 ); 查询结果为: id TypeName 1 新手 少了一条数据. 其中 查询结果为 Newcard ...

  4. Mysql 中获取刚插入的自增长id的值

    insert into user (username,password) VALUES ('); //获取刚插入的自增长id的值 select last_insert_id(); 在MySQL中,使用 ...

  5. 解决 MySQL 比如我要拉取一个消息表中用户id为1的前10条最新数据

    我们都知道,各种主流的社交应用或者阅读应用,基本都有列表类视图,并且都有滑到底部加载更多这一功能, 对应后端就是分页拉取数据.好处不言而喻,一般来说,这些数据项都是按时间倒序排列的,用户只关心最新的动 ...

  6. MySQL中进行树状所有子节点的查询 . mysql根据父id 查询所有的子id

    在Oracle 中我们知道有一个 Hierarchical Queries 通过CONNECT BY 我们可以方便的查了所有当前节点下的所有子节点.但很遗憾,在MySQL的目前版本中还没有对应的功能. ...

  7. mysql中id值被重置的情况

    MySQL中,如果你为一张使用了innodb引擎的表指定了一auto_increment列,那么这张表会有一个auto_increment计数器,专门记录当前auto_increment的相关值,用来 ...

  8. mysql中explain输出列之id的用法详解

    参考mysql5.7 en manual,对列id的解释: The SELECT identifier. This is the sequential number of the SELECT wit ...

  9. MySQL中in('5,6,7')只取第一个id为5对应的数据的思考

    通过阅读本文你可以更好的理解两个知识点: 1.#{}与${}在实际项目中的使用,避免在项目中使用不当造成不可预知的Bug; 2.MySQL中in里面如果是字符串的话,为什么只取第一个对应的数据,eg: ...

随机推荐

  1. getEl mask 用法

  2. 16SpringMvc_在业务控制方法中写入User,Admin多个模型收集参数——引出问题

    上面文章时普通的业务那个方法中收集一个实体类,这篇文章想收集两个实体类. 文本要做的是:在person.jsp页面上,有两个表单.分别是普通用户和管理员用户的表单(普通用户的表单和管理员用户的表单里面 ...

  3. jquery.Deferred promise解决异步回调

    我们先来看一下编写AJAX编码经常遇到的几个问题: 1.由于AJAX是异步的,所有依赖AJAX返回结果的代码必需写在AJAX回调函数中.这就不可避免地形成了嵌套,ajax等异步操作越多,嵌套层次就会越 ...

  4. QT QString类

    字符串有如下几个操作符 QString提供了一个二元的"+"操作符用于组合两个字符串,并提供了一个"+="操作符用于将一个字符串追加到另一个字符串的末尾,例如: ...

  5. U3D事件系统总结

    事件系统有三个要素:发送者,接收者, 转发者. 发送者有两种,一是相机,二是画布.发送者是事件的管理者,发起者,它们使用射线发射器来检测点击事件: 相机的physics Raycaster. 画面的C ...

  6. GEOS库学习之五:与GDAL/OGR结合使用

    要学习GEOS库,肯定绕不开地理方面的东西.如果需要判断的两个多边形或几何图形,不是自己创建的,而是来自shapefile文件,那就得将GEOS库和GDAL/OGR库结合使用了.实际上只需要OGR就行 ...

  7. Java系列:Collection.toArray用法研究

    该方法的签名如下: <T> T[] Collection.toArray(T[] arrayToFill); 这里想验证两个问题: 1)arrayToFill什么时候会被填充: 2)arr ...

  8. 我最优惠网系列(1)——HTML 解析类库HtmlAgilityPack

    0. 序言 在开发我最优惠网的过程中,遇到一些问题和技术点,写出来和大家分享,也是我自己对近期工作的整理和记录,预计会有解析HTML类库.本地缓存.链接跳转和C#中执行js代码技巧等方面. 1. Ht ...

  9. powerdesigner 绘制表关系和导出sql

    1.生成图(A图,B图) 2.创建关系(palette工具栏里有个线条,主表子表关系连接即可,拖动是由顺序的,一对多即从A表往B表连接) 3.这里小说一下   一开始是CDM模式,可以在软件最顶层看到 ...

  10. DOM系列---DOM获取尺寸和位置

    内容提纲: 1.获取元素CSS大小 2.获取元素实际大小 3.获取元素周边大小 本篇我们主要讨论一下页面中的某一个元素它的各种大小和各种位置的计算方式. 一.获取元素CSS大小 1.通过style获取 ...