mysql查询性能杀手:order by rand

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

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

另外请问楼主,天天广告自己的破blog烦不烦?
Renylai
2012-11-17 10:31:20 +08:00
当有部分ID是被移除导致不连续,或者不在筛选结果内的时候,楼上两位的方法也未必适用
BigZ
2012-11-17 12:00:49 +08:00
@Tianpu 我愿意写,有人愿意看,你不喜不点就是,何必在这里喷粪,装牛逼呢
BigZ
2012-11-17 12:03:26 +08:00
@Renylai 确实不完备,大规模网站的id都是支离破碎的,删帖的操作很多,这种办法能满足90%的情况,考虑到对性能的优化,是值得的,非要特别完备,哪只能在内存中缓存所有的id,然后用random.sample来选取,如果id集合很大,太容易搞漏内存了
BigZ
2012-11-17 12:04:40 +08:00
@pythonee 执行 show processlist ,看到的是一个table,其中有一列command就是显示的这个
xiawinter
2012-11-17 12:05:26 +08:00
@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