
SELECT*FROMusersWHEREtotalScoreBETWEEN5AND100ORDERBYRAND()LIMIT100
执行耗时 1.18s
SELECT*FROMusersWHEREtotalScoreBETWEEN5AND100ORDERBYRAND()LIMIT100
执行耗时 1.25s
这样的耗时不能接受。
第二种:stackoverflow 上找了一个黑科技写法:展开目录
SELECT*FROMusersWHEREtotalScoreBETWEEN5AND100ORDERBY37*(UNIX_TIMESTAMP() ^id) &0xffffLIMIT100
执行耗时 150ms
SELECT*FROMusersWHEREtotalScoreBETWEEN5AND100ORDERBY37*(UNIX_TIMESTAMP() ^id) &0xffffLIMIT100
执行耗时 153ms
执行耗时直接缩短至 150ms,已经比上一个写法快很多了,而且 LIMIT 1000 时耗时也是 150ms 左右。
第三种方式:展开目录
SELECT*
FROMusersASu
INNERJOIN(SELECTidFROMusersWHEREtotalScoreBETWEEN5AND100ORDERBYRAND()LIMIT100)AStONt.id=u.id
WHERE1
执行耗时 110ms
LIMIT 1000 时耗时也稳定在 110ms 左右。
耗时最少,推荐使用第三种。
这个问题解决的基本思路是:SELECT id FROM table WHERE date_refresh = 20120329
取出当日更新的10万 id (date_refresh 需要建立索引),放内存里面随机 shuffle 一下,顶多占用几 MB 内存,取前 3000 个,然后
SELECT * FROM table WHERE id IN (id_0, id_1, id_2, ..., id_2999)
INSERT INTO temp select * from testtable where uname='zhang'在SQL中 select、insert 、update、delete中insert是比较快的
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)