SELECT id,name,size,url,cid FROM `books` WHERE ( `id` IN ('938985','402272','494952','990241','378848','347340','834252','212315','665499','905581','303973','102113','204121','630915','419222','418447','32504','374432','460110','180892','223668') );这一句SQL运行时间为0.462839秒books表大概有300W条数据id是主键,cid是索引这样一句SQL怎么优化?

解决方案 »

  1.   

    1 id如果是主键的话 在sql层面没有优化空间了
    2 然后是优化相应存储引擎,
    3 再然后是库设计
      

  2.   


    1, 如果id是主键的话,不要怕麻烦,在范围查询中in是效率最低的,你可以试试exists:
    SELECT id,name,size,url,cid FROM `books` 
    where exists(
        select 1 from (
            select '938985' as id union select '402272' union select '494952' union select '990241' union 
            select '378848' union select '347340' union select '834252' union select '212315' union 
            select '665499' union select '905581' union select '303973' union select '102113' union 
            select '204121' union select '630915' union select '419222' union select '418447' union 
            select '32504' union select '374432' union select '460110' union select '180892' union 
            select '223668'
        )a where a.id=books.id
    )  
      

  3.   


    还有看看 show variables like 'key_buffer_size'; 
    key_buffer_size不要超过总内存的50%,最好设置成25%,不然系统将转换为页并变得极慢。
      

  4.   

    在参数上看看,是否可以加大read_buffer_size 等这类的参数.
      

  5.   

    把IN语句转换成JOIN语句。这个是个优化的惯例。另外ID一般都是INT型的,你的怎么是字符串??字符串的效率比INT的差。
      

  6.   

    在MYSQL中 IN 和 JOIN 的效率问题,本版精华贴中曾经发过一个贴子,很多人都做了讨论。[求证&散分]MySQL 中 where id in (1,2,3,4,...) 的效率问题讨论 [推荐] 
      

  7.   

    根据群里兄弟的提示,我改成了用union连接每个id的方式SELECT id,name,size,url,cid FROM books_books WHERE id=356922 union SELECT id,name,size,url,cid FROM books_books WHERE id=590424 union SELECT id,name,size,url,cid FROM books_books WHERE id=624263 union SELECT id,name,size,url,cid FROM books_books WHERE id=451215 union SELECT id,name,size,url,cid FROM books_books WHERE id=25654 union SELECT id,name,size,url,cid FROM books_books WHERE id=123014 union SELECT id,name,size,url,cid FROM books_books WHERE id=840266 union SELECT id,name,size,url,cid FROM books_books WHERE id=914230 union SELECT id,name,size,url,cid FROM books_books WHERE id=753272 union SELECT id,name,size,url,cid FROM books_books WHERE id=394418 union SELECT id,name,size,url,cid FROM books_books WHERE id=732308 union SELECT id,name,size,url,cid FROM books_books WHERE id=250606 union SELECT id,name,size,url,cid FROM books_books WHERE id=824361 union SELECT id,name,size,url,cid FROM books_books WHERE id=110719 union SELECT id,name,size,url,cid FROM books_books WHERE id=733870 union SELECT id,name,size,url,cid FROM books_books WHERE id=48850 union SELECT id,name,size,url,cid FROM books_books WHERE id=996726 union SELECT id,name,size,url,cid FROM books_books WHERE id=245274 union SELECT id,name,size,url,cid FROM books_books WHERE id=351694 union SELECT id,name,size,url,cid FROM books_books WHERE id=649377 结果还是一样速度很慢,也是>0.1s的
      

  8.   


    你的一个简单范围查询就有300W记录了。那么你一个单表至少有几千万条记录了吧,这个时候,需要分表或者分区了啊!按照业务查询分区或者分表,就可以了!将经常查询的按照id分在一个区域吧!
      

  9.   


    我猜测是myisam吧,不然300W,可能不至0.46s呢!
      

  10.   

    只能分区么,我不是dba
    分区需要很高的技巧么?
    怕分出问题来
      

  11.   

    只能分区么,我不是dba
    分区需要很高的技巧么?
    怕分出问题来
      

  12.   

    0.462839秒还不叫慢?
    我访问的时候都能明显感觉到延迟
    我的理想是<0.1s
      

  13.   

    SELECT id,name,size,url,cid FROM `books` WHERE  `id` IN ('938985')
    的速度是多少?SELECT id,name,size,url,cid FROM `books` WHERE  `id` ='938985'
    的速度是多少?
      

  14.   

    1.尽可能的使用exists代替in
    2.建立必要的分区表
      

  15.   

    这语句不可能优化了,mysql怎么这么慢网页更新监控工具
    实时js调试工具(IE)
      

  16.   

    我的意思是要你先不要求出这个串,再用IN,而是直接用2个表JOIN连接查询。
      

  17.   

    memcache?
    用memcache怎么存?
    这个不是缓存的问题
    因为买个用户提取到的id列表不一样,而且基本没有第二次访问
    如果缓存反而更加得不偿失如果整个表全部缓存,那样也太大了点