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 · 136 天前 · 2128 次点击
    这是一个创建于 136 天前的主题,其中的信息可能已经有所发展或是发生改变。

    从用户表中按 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 条附言  ·  136 天前
    已经解决,感谢大家帮助

    ```
    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   136 天前
    mysql 就这样了
    chaucerling
        2
    chaucerling   136 天前
    你这里 filesort 肯定是没索引好,8.0 之后可以建倒序索引
    npe
        3
    npe   136 天前
    Redis Zrank
    mxT52CRuqR6o5
        4
    mxT52CRuqR6o5   136 天前
    这种排名好像一般都不是实时的吧
    limuyan44
        5
    limuyan44   136 天前
    求排名不是 count 一下就好了吗为啥要拿变量求
    chenqh
        6
    chenqh   136 天前
    select count 不久好了吗?
    Thinklong
        7
    Thinklong   136 天前
    好家伙,直接 MySQL 编程了呀,如果只是一个用户一条数据、并且不考虑同分排名,直接 count,并且 jifen_all 大于等于当前用户的 jifen_all (可以子查询也可以单查再传参) count 结果就是你的排名
    Actrace
        8
    Actrace   136 天前   ❤️ 2
    尽量不要在数据库里搞编程。
    哪怕是把数据取出来计算完逻辑再放临时表排序都比直接计算来的快很多。毕竟数据库的算力是很宝贵的,而且大多数数据库只对排序做了优化。
    dapang1221
        9
    dapang1221   136 天前
    你这又是计算又是 select 套娃……建议分几次查询,在业务里解决
    wowo243
        10
    wowo243   136 天前
    丢 redis 或者直接拿内存里做,就几万条数据而已
    QiangZai
        11
    QiangZai   136 天前
    根据同样的需求写了一个:SELECT count( * ) FROM student_user WHERE login_count >= ( SELECT login_count FROM student_user WHERE id = 24 )
    edk24
        12
    edk24   136 天前
    @QiangZai
    @Thinklong
    @chenqh
    @chaucerling

    谢谢已经用 count + jifen_all < 我的积分 解决了,不过有个前十名排名是公开的。 那个我单独去处理
    polymerdg
        13
    polymerdg   136 天前
    樓上 這個可以
    emeab
        14
    emeab   136 天前
    排名其实不需要做实时的嘛
    edk24
        15
    edk24   136 天前
    @wowo243
    @npe

    公司的活动服务器, 不是我在管理, 还是 windows server 没有安装 redis 。 怕搞坏了不敢动。 哈哈 谢谢建议
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2629 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 12:48 · PVG 20:48 · LAX 05:48 · JFK 08:48
    ♥ Do have faith in what you're doing.