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

2021-06-11 15:21:47 +08:00
 edk24

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

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

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

公司的活动服务器, 不是我在管理, 还是 windows server 没有安装 redis 。 怕搞坏了不敢动。 哈哈 谢谢建议

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

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

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

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

© 2021 V2EX