想查询一张表中的数据String ids = "124,123,254,148,154";String sql = "select * from emp where id in ("+ ids +")";问题如下:当ids很长的时候,查询不仅很慢,而且会报错,怎么弄比较好?有解决的办法吗?????
ids数据长度一般为1W+  ,表的记录条数为30W+

解决方案 »

  1.   

    MYSQL有一个参数 max_allowed_packet ,定义了SQL语句的最大长度。 把这个改大试一下。
    mysql> show variables like 'max_allowed_packet';
    +--------------------+---------+
    | Variable_name      | Value   |
    +--------------------+---------+
    | max_allowed_packet | 1048576 |
    +--------------------+---------+
    1 row in set (0.00 sec)mysql>
      

  2.   

    另外也不建议这样做。你可以把IDS中的每个数字直接写到某个临时表中 temp_x(id int),然后再直接用JOIN查询。这样会好一点儿。
      

  3.   

    max_allowed_packet 把这个加大。
    MYSQL在处理IN的时候,过程是在记录里取出一个数,然后到IN列表里面用2分法去查询,是否存在相同的,U如果有,那么把记录拿出来,组成结果集。MSSQL在处理的时候会一条条去判断,类似OR的方法。MYSQL在处理IN的时候相对来说还是比较高效。在比较列的长度很大的时候,2分法也快不到哪去。建一个中间表,把需要比较的值写进去,再加个索引,用JOIN连接查询,效率会高很多。