zoukankan      html  css  js  c++  java
  • MySQL 中 where id in (1,2,3,4,...) 的效率问题讨论

    MySQL

    ACMAIN_CHMACMAIN_CHM06-26 16:36
    等级 T12 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);
     
    wangxuantestwangxuantest06-26 16:43
    等级 T12 1楼

    支持楼主  呵呵  有才人啊

    liangCKliangCK06-26 16:55
    等级 T12 2楼

    先接个分..再看.

    apple_8180apple_818006-26 16:56
    等级 T12 3楼

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

    ConryConry06-26 16:56
    等级 T12 4楼

     

    引用 2 楼 liangCK 的回复:
    先接个分..再看.

    up
    netxuningnetxuning06-26 16:59
    等级 T12 5楼

    支持

    liangCKliangCK06-26 16:59
    等级 T12 6楼

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

    然后与表做JOIN操作.

    apple_8180apple_818006-26 17:05
    等级 T12 7楼

     

    引用 6 楼 liangCK 的回复:
    我认为分两步. 
    先将提供的ID转成行集. 
    ID 
    ----- 
    38068 
    238833 
    308799 
    .. 

    然后与表做JOIN操作.


    我3楼就是这个意思。

    实际还要对比 Join 和 In 在本例中那个效率高
    WWWWAWWWWA06-26 17:11
    等级 T12 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;



    WWWWAWWWWA06-26 17:21
    等级 T12 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秒

    lastyanglastyang06-26 18:10
    等级 T12 10楼

    帮顶

    nettmannettman06-26 18:10
    等级 T12 11楼

    友情UP!

    LongYongkaiLongYongkai06-26 21:28
    等级 T12 12楼

    UP

    kaifayekaifaye06-27 02:01
    等级 T12 13楼

    看看~~~~~~

    why_javawhy_java06-27 08:48
    等级 T12 14楼

    UP 学习了

    yhjhooyhjhoo06-27 11:19
    等级 T12 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…


    感觉还是把这些数据放到一张表里面好
    bllizardbllizard06-27 12:18
    等级 T12 16楼

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

    xuronghua5000xuronghua500006-27 12:47
    等级 T12 17楼

    学习了

    LIXG425LIXG42506-27 17:15
    等级 T12 18楼

    jie fen ...

    wangchaozhongwangchaozhong06-27 17:36
    等级 T12 19楼

    学习加接分

    josyjosy06-27 20:00
    等级 T12 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

    WWWWAWWWWA06-29 10:04
    等级 T12 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

    WWWWAWWWWA06-29 10:17
    等级 T12 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 ;

    WWWWAWWWWA06-29 10:52
    等级 T12 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方法时间相差不多。

    claroclaro06-29 11:12
    等级 T12 24楼

     

    引用 2 楼 liangCK 的回复:
    先接个分..再看.
    hkz0318hkz031806-29 13:43
    等级 T12 25楼


    学习ing

    vinsonshenvinsonshen06-29 16:08
    等级 T12 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的值清单的数据量。
    wwwwbwwwwb06-29 16:10
    等级 T12 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这部分放进临时表并建立索引来关联的速度是…

    对,我倾向于用临时表方法,除效率外,还有个人的习惯,呵呵。
    scilandsciland06-30 08:56
    等级 T12 28楼

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

    jichangh1983jichangh198307-01 17:39
    等级 T12 29楼

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

    duxiangheduxianghe07-03 17:36
    等级 T12 30楼

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

    zgycsmbzgycsmb07-04 11:33
    等级 T12 31楼

    jf

    code_killercode_killer07-04 23:27
    等级 T12 32楼

     

    引用 30 楼 duxianghe 的回复:
    我认为直接用In 是最快的。


    我也是这么想的
    zf213zf21307-06 10:11
    等级 T12 33楼

    学习一下

    MSTOPMSTOP07-08 21:45
    等级 T12 34楼

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

    yueliangdao0608yueliangdao060807-09 11:09
    等级 T12 35楼

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

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

    wwwwbwwwwb07-09 11:13
    等级 T12 36楼

     

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

    版主测试过没有,数据量多大时,IN的效率>临时表?谢谢
    vinsonshenvinsonshen07-09 11:43
    等级 T12 37楼

     

    引用 35 楼 yueliangdao0608 的回复:
    其实在特大的高压下,你会发现IN的效率很高! 

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



    你的源表的数据量多大?
    vinsonshenvinsonshen07-09 11:45
    等级 T12 38楼

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

    MSTOPMSTOP07-09 16:10
    等级 T12 39楼

     

    引用 35 楼 yueliangdao0608 的回复:
    其实在特大的高压下,你会发现IN的效率很高! 

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

    这也有可能. IN ( ...... ) 经MYSQL优化后可能变成有序的内存表或数组了.
    ACMAIN_CHMACMAIN_CHM07-09 16:16
    等级 T12 40楼



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


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

    ACMAIN_CHMACMAIN_CHM07-09 21:34
    等级 T12 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 ... )

    bllizardbllizard07-10 14:26
    等级 T12 42楼

    为什么用index就不行咧?

    liulcsterliulcster07-10 17:11
    等级 T12 43楼

    学习一下

    hardwinhardwin07-13 22:18
    等级 T12 44楼

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

    huolinhuolin07-14 15:51
    等级 T12 45楼

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

    wt3216767wt321676707-14 17:03
    等级 T12 46楼

    学习一下 

    bigfoot001bigfoot00107-15 08:43
    等级 T12 47楼

    UP

    flairskyflairsky07-15 11:29
    等级 T12 48楼

    围观,支持in

    yueliangdao0608yueliangdao060807-15 16:23
    等级 T12 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_ljfljf_ljf07-15 18:50
    等级 T12 50楼

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

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

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

    cxyy_cxyy_07-16 15:46
    等级 T12 51楼

    又学习了

    dawncodawnco08-25 11:53
    等级 T12 52楼

    学习了

    zhoupuyuezhoupuyue09-03 13:06
    等级 T12 53楼

    nianzhang747nianzhang74709-03 13:48
    等级 T12 54楼

    版主 还没结贴呢 

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

    denniswwhdenniswwh09-03 14:22
    等级 T12 55楼

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

    ComgardenComgarden09-03 14:30
    等级 T12 56楼

    mark

    zuoxingyuzuoxingyu03-31 02:18
    等级 T12 57楼

    MARK

    fuyongjiefuyongjie04-01 11:14
    等级 T12 58楼

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

    dong308dong30804-02 18:21
    等级 T12 59楼

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

    shrimpmashrimpma06-24 08:54
    等级 T12 60楼

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

    wubai250wubai25006-30 09:41
    等级 T12 61楼

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

    m582445672m58244567207-09 17:51
    等级 T12 62楼

     mark

    vgavga12-10 07:34
    等级 T12 63楼

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

    用 join

    popvivpopviv12-17 00:49
    等级 T12 67楼

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

    tuzwutuzwu01-05 23:23
    等级 T12 68楼

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

    fengyqffengyqf01-20 11:54
    等级 T12 69楼

     

    引用 63 楼 vga 的回复:
    如果我的in里有5W个Id或更多,结果会怎样呢?

    用 join


    同意
    edwinboyanedwinboyan02-26 12:21
    等级 T12 70楼

    好帖!

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

    a3580737a358073706-20 17:10
    等级 T12 72楼

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

    garykillergarykiller06-27 15:18
    等级 T12 73楼

    mark

    kxn308kxn30809-06 15:51
    等级 T12 74楼

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

    jsnjmayangjsnjmayang11-03 09:03
    等级 T12 75楼

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

    PhpNewnewPhpNewnew12-12 20:36
    等级 T12 76楼

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

    kitewellkitewell12-21 10:34
    等级 T12 77楼

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

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

    a435911004a43591100404-26 15:23
    等级 T12 79楼

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

    csdncbcsdncb05-15 07:56
    等级 T12 81楼

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

    rrttyyuirrttyyui06-20 14:20
    等级 T12 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

    hesaer01hesaer0108-24 10:53
    等级 T12 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_2011ft_201110-25 09:12
    等级 T12 84楼

    mark下学习用

    0 0 回复 分享
    img即使是一小步
    也想与你分享

  • 相关阅读:
    java算法集训结果填空题练习2
    java算法集训结果填空题练习1
    java算法集训结果填空题练习1
    java算法集训结果填空题练习1
    java算法集训结果填空题练习1
    java算法集训结果填空题练习1
    java算法集训代码填空题练习3
    java算法集训代码填空题练习3
    java算法集训代码填空题练习3
    java算法集训代码填空题练习3
  • 原文地址:https://www.cnblogs.com/kabi/p/5908738.html
Copyright © 2011-2022 走看看