现在 MySQL Rand(1,5W) 速度都很慢, 该如何优化呢

2016-10-07 08:11:39 +08:00
 xjroot

现在数据需求很大,rand 后查询速度是 0.5 秒的速度 可是查询量大了后明显变慢。

我现在是使用了 Redis ,可是跑挂是时常存在的,该如何彻底解决 rand 与 cache 共存高性能化呢。

环境:nginx Mysql5.7 Redis , session ( memcached) ,

4763 次点击
所在节点    MySQL
14 条回复
cdwyd
2016-10-07 08:30:10 +08:00
id 连续的话,先生成 id 然后取数据
loading
2016-10-07 09:32:20 +08:00
rand 我们都是在程序里生成的,这几乎成了常识……
ericls
2016-10-07 10:00:34 +08:00
楼上正解,随机的 ID 要先在程序里面生成,再查询
Immortal
2016-10-07 10:04:01 +08:00
能用代码解决的问题不要放到数据库...这个的确是常识
mokeyjay
2016-10-07 17:10:08 +08:00
不是都说 mysql 的 rand 效率很低嘛
rqrq
2016-10-07 22:45:58 +08:00
今天也折腾了下,普通的就用自增 id 1-max 随机取出一个数字,然后取 id >= 随机数字 LIMIT 1 就行了
参考: http://www.drupal001.com/2012/01/solution_for_mysql_random_results/
xjroot
2016-10-07 23:10:50 +08:00
@loading @ericls @cdwyd 感谢感谢,几位的建议,我现在就准备在 PHP 中 rand 一些然后直接主键形式从 sql 里查询出来速度确实很快了,可是这类 rand,会不会产生一些性能上注意的,能否在给点思路.

@Immortal @mokeyjay 对不住对不住献丑了哈,感谢感谢 @rqrq 这个我试过了,给一个范围值可是在数据量比较大的时候,并且请求过高时就会有很尴尬的问题比如: Mysql 挂掉,内存不足( 64G )等;我觉得还是楼上说的很对,能让 php 处理的事情就别让 mysql 处理。这个是真理,最后感谢你哥们拿出了你宝贵时间给我回复这么认真。感谢
cdwyd
2016-10-07 23:20:51 +08:00
大概有 3000 万数据,随机生成 1000 个 id ,然后用的 where id in 速度挺快的( 2g 内存的 vps )
xjroot
2016-10-07 23:21:43 +08:00
@cdwyd 单表??? 3000 万????????? WTF !!
msg7086
2016-10-08 02:23:34 +08:00
@xjroot 单表三千万怎么了……?一条数据 1k 的话也就 30G 的样子啊。

还是说你觉得太少了?
cdwyd
2016-10-08 08:16:02 +08:00
@xjroot
主键查询,单表 3000 没有什么压力
findex
2016-10-08 09:07:32 +08:00
@cdwyd 嗯。如果逻辑要是复杂一点,准备怎么查询呢?一个表有很多外键的那种。估计压力也不大吧。
cdwyd
2016-10-08 09:17:32 +08:00
我自己用的时候一般都是拆分成了多次单表查询然后开缓存,对于热门数据速度还是可以的。

压力大不大试过才知道,没做的时候总想着分库分表什么的,其实可能用不到。
xjroot
2016-11-11 02:03:10 +08:00
@msg7086 我没有做过单表三千万。。。我得重新优化一下了

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

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

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

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

© 2021 V2EX