首页新闻找找看学习计划

mysql join+orderby这种语句怎么优化有什么解决方案?

0
悬赏园豆:50 [已解决问题] 解决于 2019-12-03 12:17

项目中有个需求根据充值金额大小来排序,有两张表:
表一:ai_user(用户表)
表二:ai_user_data(用户数据信息表 用来存放用户的充值总额和其他信息)。
使用join 查询出用户充值总额字段,再根据这个字段排序,执行时间需要1秒多点,想问问大佬,有什么优化的办法嘛,检查查询排序的时间,不使用orderby 速度非常快,加了orderby的效率就下来了。sql 语句如下:
SELECT u.*,ud.recharge AS recharge_money,ud.chat_num AS get_chat_count FROM ai_user u INNER JOIN ai_user_data ud ON u.uid=ud.uid WHERE uidentity = 1 AND utype = 1 ORDER BY recharge_money DESC LIMIT 0,20;

两张表的数据量两张都在十四万左右。
求大佬给个思路或者方案呗。

编外程序员的主页 编外程序员 | 初学一级 | 园豆:152
提问于:2019-12-03 10:36
< >
分享
最佳答案
0

有没有给 recharge_money 字段建立索引?

收获园豆:50
dudu | 高人七级 |园豆:39952 | 2019-12-03 10:38

有建索引,但是EXPLAIN 分析好像没有走这个索引

编外程序员 | 园豆:152 (初学一级) | 2019-12-03 10:40

@编外程序员: 不 join ,用 recharge_money 对 ai_user_data 表进行排序的速度怎样?

dudu | 园豆:39952 (高人七级) | 2019-12-03 11:39

@dudu:
SELECT * FROM ai_user_data ORDER BY recharge desc LIMIT 0,20 [ RunTime:0.065782s ]
0.06s 左右

编外程序员 | 园豆:152 (初学一级) | 2019-12-03 11:49

@编外程序员: 建议试试将 u.* 改为所需要的字段

dudu | 园豆:39952 (高人七级) | 2019-12-03 11:59

@dudu: 有效果,改完现在查询在0.55s 左右,非常感谢你的帮助!

编外程序员 | 园豆:152 (初学一级) | 2019-12-03 12:16

@编外程序员: 有没有建立包含 uidentityutype 这2个字段的索引?

dudu | 园豆:39952 (高人七级) | 2019-12-03 12:18

@dudu: 这两个字段有建立组合索引

编外程序员 | 园豆:152 (初学一级) | 2019-12-03 12:26
其他回答(3)
0

排序字段建索引,多个字段排序可以用联合索引

Ctrl` | 园豆:2162 (老鸟四级) | 2019-12-03 10:39
0

建议将where条件的字段和排序的字段组成 组合索引 速度应该快很多

初夏的阳光丶 | 园豆:482 (菜鸟二级) | 2019-12-03 11:07

where字段和排序字段不是同一张表

支持(0) 反对(0) 编外程序员 | 园豆:152 (初学一级) | 2019-12-03 11:10

@编外程序员: 可以尝试一下在sql外包一层 select * from (SELECT u.*,ud.recharge AS recharge_money,ud.chat_num AS get_chat_count FROM ai_user u INNER JOIN ai_user_data ud ON u.uid=ud.uid WHERE uidentity = 1 AND utype = 1 ORDER BY recharge_money DESC LIMIT 0,20) as t order by t.recharge_money

支持(0) 反对(0) 初夏的阳光丶 | 园豆:482 (菜鸟二级) | 2019-12-03 11:33
0

排序字段建索引吧

历久弥坚 | 园豆:202 (菜鸟二级) | 2019-12-03 11:55
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册