› 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 · Jun 11, 2021 · 4788 views
    This topic created in 1940 days ago, the information mentioned may be changed or developed.

    从用户表中按 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 加了索引,怎么避全表扫描又能取出排名?

    Supplement 1  ·  Jun 11, 2021
    已经解决,感谢大家帮助

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

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

    公司的活动服务器, 不是我在管理, 还是 windows server 没有安装 redis 。 怕搞坏了不敢动。 哈哈 谢谢建议
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   787 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 50ms · UTC 21:46 · PVG 05:46 · LAX 14:46 · JFK 17:46
    ♥ Do have faith in what you're doing.