mysql查询性能杀手:order by rand

2012 年 11 月 16 日
 BigZ
今天花了大半天来修复这个问题,效果很好
http://lutaf.com/63.htm
5214 次点击
所在节点    MySQL
8 条回复
pythonee
2012 年 11 月 17 日
弱弱问一下,你怎么用show processlist 来看出很多
converting HEAP to MyISAM
Copying to tmp table on disk
这样的command

想看看你怎么追踪到这个问题的
KiseXu
2012 年 11 月 17 日
随机查询可以用后端语言根据max(id)先随机出想要的id,再根据id取出啊。这样就和数据库性能无关啦
Tianpu
2012 年 11 月 17 日
$ids = array();
$max = 100;
for($i=0;$i<$max;$i++) if(!in_array($i,$ids)) $ids[] = $i;

另外请问楼主,天天广告自己的破blog烦不烦?
Renylai
2012 年 11 月 17 日
当有部分ID是被移除导致不连续,或者不在筛选结果内的时候,楼上两位的方法也未必适用
BigZ
2012 年 11 月 17 日
@Tianpu 我愿意写,有人愿意看,你不喜不点就是,何必在这里喷粪,装牛逼呢
BigZ
2012 年 11 月 17 日
@Renylai 确实不完备,大规模网站的id都是支离破碎的,删帖的操作很多,这种办法能满足90%的情况,考虑到对性能的优化,是值得的,非要特别完备,哪只能在内存中缓存所有的id,然后用random.sample来选取,如果id集合很大,太容易搞漏内存了
BigZ
2012 年 11 月 17 日
@pythonee 执行 show processlist ,看到的是一个table,其中有一列command就是显示的这个
xiawinter
2012 年 11 月 17 日
@Renylai 取位置id, 不过这样查询对于大表也不是很好, 类似 offset 10000 limit 1

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/52561

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX