V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
xjroot
V2EX  ›  MySQL

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

  •  
  •   xjroot · 2016-10-07 08:11:39 +08:00 · 4782 次点击
    这是一个创建于 3004 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    14 条回复    2016-11-11 02:03:10 +08:00
    cdwyd
        1
    cdwyd  
       2016-10-07 08:30:10 +08:00 via Android
    id 连续的话,先生成 id 然后取数据
    loading
        2
    loading  
       2016-10-07 09:32:20 +08:00 via Android   ❤️ 1
    rand 我们都是在程序里生成的,这几乎成了常识……
    ericls
        3
    ericls  
       2016-10-07 10:00:34 +08:00   ❤️ 1
    楼上正解,随机的 ID 要先在程序里面生成,再查询
    Immortal
        4
    Immortal  
       2016-10-07 10:04:01 +08:00   ❤️ 1
    能用代码解决的问题不要放到数据库...这个的确是常识
    mokeyjay
        5
    mokeyjay  
       2016-10-07 17:10:08 +08:00 via Android
    不是都说 mysql 的 rand 效率很低嘛
    rqrq
        6
    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
        7
    xjroot  
    OP
       2016-10-07 23:10:50 +08:00
    @loading @ericls @cdwyd 感谢感谢,几位的建议,我现在就准备在 PHP 中 rand 一些然后直接主键形式从 sql 里查询出来速度确实很快了,可是这类 rand,会不会产生一些性能上注意的,能否在给点思路.

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

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

    压力大不大试过才知道,没做的时候总想着分库分表什么的,其实可能用不到。
    xjroot
        14
    xjroot  
    OP
       2016-11-11 02:03:10 +08:00
    @msg7086 我没有做过单表三千万。。。我得重新优化一下了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2294 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 00:03 · PVG 08:03 · LAX 16:03 · JFK 19:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.