项目中有个需求根据充值金额大小来排序,有两张表:
表一: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;
两张表的数据量两张都在十四万左右。
求大佬给个思路或者方案呗。
有没有给 recharge_money
字段建立索引?
有建索引,但是EXPLAIN 分析好像没有走这个索引
@编外程序员: 不 join ,用 recharge_money 对 ai_user_data 表进行排序的速度怎样?
@dudu:
SELECT * FROM ai_user_data
ORDER BY recharge
desc LIMIT 0,20 [ RunTime:0.065782s ]
0.06s 左右
@编外程序员: 建议试试将 u.*
改为所需要的字段
@dudu: 有效果,改完现在查询在0.55s 左右,非常感谢你的帮助!
@编外程序员: 有没有建立包含 uidentity
与 utype
这2个字段的索引?
@dudu: 这两个字段有建立组合索引
排序字段建索引,多个字段排序可以用联合索引
建议将where条件的字段和排序的字段组成 组合索引 速度应该快很多
where字段和排序字段不是同一张表
@编外程序员: 可以尝试一下在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
排序字段建索引吧