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
edk24
V2EX  ?  MySQL

求 sql 优化才几万数据查询都破 1s 了

  •  
  •   edk24 ·
    edk24 · 2021-06-11 15:21:47 +08:00 · 3114 次点击
    这是一个创建于 1057 天前的主题,其中的信息可能已经有所发展或是发生改变。

    腾讯云最新优惠活动来了:云产品限时1折,云服务器低至88元/年 ,点击这里立即抢购:9i0i.cn/qcloud,更有2860元代金券免费领取,付款直接抵现金用,点击这里立即领取:9i0i.cn/qcloudquan

    (福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

    从用户表中按 jifen_all 获取我的排名。

    SELECT b.rank FROM
            (
            SELECT t.id, @rownum := @rownum + 1 AS rank
              
            FROM (SELECT @rownum := 0) r,
              
            (SELECT id FROM fa_bankgy_dsxx_user ORDER BY jifen_all DESC) AS t
              
            ) AS b WHERE b.id = 29605;
    				
    

    CREATE TABLE `fa_bankgy_dsxx_user` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `nickname` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,
      `openid` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
      `avatar` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
      `realname` varchar(24) COLLATE utf8mb4_unicode_ci NOT NULL,
      `mobile` varchar(24) COLLATE utf8mb4_unicode_ci NOT NULL,
      `province` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL,
      `city` varchar(30) COLLATE utf8mb4_unicode_ci NOT NULL,
      `area` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,
      `workunit` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL,
      `exchange_count` int(11) DEFAULT '0',
      `dati_count` int(11) DEFAULT '0' COMMENT '答题次数',
      `rank_fen` int(11) DEFAULT '0',
      `jifen_all` int(255) DEFAULT '0', 累计积分数量
      `jifen` int(11) NOT NULL DEFAULT '0',
      `createtime` int(11) NOT NULL,
      `updatetime` int(11) NOT NULL,
      `deletetime` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `jifen_all` (`jifen_all`),
      KEY `openid` (`openid`),
      KEY `workunit` (`workunit`)
    ) ENGINE=MyISAM AUTO_INCREMENT=33259 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
    

    jifen_all 加了索引,怎么避全表扫描又能取出排名?

    第 1 条附言  ·  2021-06-11 16:09:29 +08:00
    已经解决,感谢大家帮助

    ```
    select count(*) as rank from fa_bankgy_dsxx_user where jifen_all >= (select jifen_all from fa_bankgy_dsxx_user where id = 29605 limit 1) ORDER BY jifen_all DESC;
    ```

    有个缺点就是两个人积分同样, 排名也一样了。

    比如最高积分的两个人:
    a 先生积分 435,排名 2
    b 先生积分 435,排名 2


    我这边有个前十公开排名那个我单独做处理就好
    15 条回复  ?  2021-06-11 16:12:24 +08:00
    liprais
        1
    liprais  
       2021-06-11 15:25:57 +08:00
    mysql 就这样了
    chaucerling
        2
    chaucerling  
       2021-06-11 15:32:00 +08:00
    你这里 filesort 肯定是没索引好,8.0 之后可以建倒序索引
    npe
        3
    npe  
       2021-06-11 15:35:20 +08:00
    Redis Zrank
    mxT52CRuqR6o5
        4
    mxT52CRuqR6o5  
       2021-06-11 15:37:21 +08:00
    这种排名好像一般都不是实时的吧
    limuyan44
        5
    limuyan44  
       2021-06-11 15:38:57 +08:00
    求排名不是 count 一下就好了吗为啥要拿变量求
    chenqh
        6
    chenqh  
       2021-06-11 15:39:23 +08:00
    select count 不久好了吗?
    Thinklong
        7
    Thinklong  
       2021-06-11 15:51:01 +08:00
    好家伙,直接 MySQL 编程了呀,如果只是一个用户一条数据、并且不考虑同分排名,直接 count,并且 jifen_all 大于等于当前用户的 jifen_all (可以子查询也可以单查再传参) count 结果就是你的排名
    Actrace
        8
    Actrace  
       2021-06-11 15:54:36 +08:00   ?? 2
    尽量不要在数据库里搞编程。
    哪怕是把数据取出来计算完逻辑再放临时表排序都比直接计算来的快很多。毕竟数据库的算力是很宝贵的,而且大多数数据库只对排序做了优化。
    dapang1221
        9
    dapang1221  
       2021-06-11 15:56:01 +08:00
    你这又是计算又是 select 套娃……建议分几次查询,在业务里解决
    wowo243
        10
    wowo243  
       2021-06-11 15:56:14 +08:00
    丢 redis 或者直接拿内存里做,就几万条数据而已
    QiangZai
        11
    QiangZai  
       2021-06-11 15:56:54 +08:00
    根据同样的需求写了一个:SELECT count( * ) FROM student_user WHERE login_count >= ( SELECT login_count FROM student_user WHERE id = 24 )
    edk24
        12
    edk24  
    OP
       2021-06-11 16:06:40 +08:00
    @QiangZai
    @Thinklong
    @chenqh
    @chaucerling

    谢谢已经用 count + jifen_all < 我的积分 解决了,不过有个前十名排名是公开的。 那个我单独去处理
    polymerdg
        13
    polymerdg  
       2021-06-11 16:07:20 +08:00
    樓上 這個可以
    emeab
        14
    emeab  
       2021-06-11 16:11:00 +08:00
    排名其实不需要做实时的嘛
    edk24
        15
    edk24  
    OP
       2021-06-11 16:12:24 +08:00
    @wowo243
    @npe

    公司的活动服务器, 不是我在管理, 还是 windows server 没有安装 redis 。 怕搞坏了不敢动。 哈哈 谢谢建议
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2291 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 08:18 · PVG 16:18 · LAX 01:18 · JFK 04:18
    Developed with CodeLauncher
    ? Do have faith in what you're doing.


    http://www.vxiaotou.com