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怎么优化?
2 然后是优化相应存储引擎,
3 再然后是库设计
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
)
还有看看 show variables like 'key_buffer_size';
key_buffer_size不要超过总内存的50%,最好设置成25%,不然系统将转换为页并变得极慢。
你的一个简单范围查询就有300W记录了。那么你一个单表至少有几千万条记录了吧,这个时候,需要分表或者分区了啊!按照业务查询分区或者分表,就可以了!将经常查询的按照id分在一个区域吧!
我猜测是myisam吧,不然300W,可能不至0.46s呢!
分区需要很高的技巧么?
怕分出问题来
分区需要很高的技巧么?
怕分出问题来
我访问的时候都能明显感觉到延迟
我的理想是<0.1s
的速度是多少?SELECT id,name,size,url,cid FROM `books` WHERE `id` ='938985'
的速度是多少?
2.建立必要的分区表
实时js调试工具(IE)
用memcache怎么存?
这个不是缓存的问题
因为买个用户提取到的id列表不一样,而且基本没有第二次访问
如果缓存反而更加得不偿失如果整个表全部缓存,那样也太大了点