mysql - 通过内连接优化 rand 性能

标签 mysql performance

我有一个像这样的 SQL 查询:

SELECT `users`.`name`, `users`.`username`, `users`.`bio`, `users`.`city`, `users`.`photo` 
FROM (`onlines`) JOIN `users` 
ON `onlines`.`username`=`users`.`username` 
WHERE `users`.`offline_status` = 0 
AND `users`.`perma_ban` = 0 
AND `users`.`is_premium` = 1 
GROUP BY `onlines`.`username` 
ORDER BY RAND() LIMIT 27

我正在使用 RAND,但我对性能不满意。我该如何优化这个查询?

我读到了这个:

How can i optimize MySQL's ORDER BY RAND() function?

但是我正在使用内部联接,所以这个问题对我没有帮助。

最佳答案

首先从用户中随机选择27个用户名,考虑到以下限制:

WHERE `users`.`offline_status` = 0 
  AND `users`.`perma_ban` = 0 
  AND `users`.`is_premium` = 1 

那么你就快完成了。 onlines 几乎没有为查询提供任何内容;它所做的只是消除任何未出现在在线中的用户名。所以只需添加

  AND NOT EXISTS ( SELECT * FROM onlines WHERE username = users.username )

然后转到提到的链接,或my blog ,其扩展性更好。它提供了 5 个有效的答案。但如果不回答更多问题,我无法告诉您哪个答案最适合您的情况。

关于mysql - 通过内连接优化 rand 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35120906/

相关文章:

php - 代码不适用于网络托管,但适用于本地主机

php - Laravel Raw SQL 查询命名参数绑定(bind)顺序

mysql - NHibernate 和 MySql 关键字

c++ - 使用多个处理器加速程序

mysql - 加入ON日期集团

使用 wamp 服务器时 PHP 脚本不起作用

CSS 选择器效率

提交的应用程序包和实时应用程序包之间的性能差异

python - 如何有效地检查给定的 IP 地址是否属于 Python 中的 IP 子网?

python - 如何向量化以下python代码?