首页 新闻 会员 周边 捐助

个人想让人远程帮协助下SQL运行效率遇到的问题,在那里找比较靠谱?

0
悬赏园豆:30 [待解决问题]

工作上遇到的问题,比较简单的几张表关联查询。
【入住信息表】 关联【床位表】关联【人员信息表】 查询只需要2秒
如果再加上
【用户学院信息表】where 筛选指定几个学院编号下的用户 ID
查询就需要到12秒以上,客户现场到20秒以上。
本地数据量与现场一致,大约4万条。
也尝试过把【用户学院信息表】使用inner join 的方式过滤但,效率一样,且使用 where 的方式对代码改造比较好。
有时候2秒的查询也要花10秒,时快时慢,这是什么原因呢?

快一点的查询

加上过滤 要到12秒的查询

改为inner join 的方式查询

为什么加这个过滤,涉及数据权限限定,指定人员只能看到指定学院的下的入住住宿信息,学院编号College_Cur_Number 有规律,如 一级学院编号 000 ,其下一级学院就是0000001 。
如果有更好的 数据权限限制方式,设计方式,以及解决上面问题,麻烦指教下,谢谢了!可适当付费

wewehahayuyu的主页 wewehahayuyu | 初学一级 | 园豆:30
提问于:2023-05-12 16:44
< >
分享
所有回答(4)
0

个人拙见:
1.重要表(高频表)索引(Btree+)建立;
2. 用户学院信息 College_Cur_Number 字段添加索引 或者学院层级固定的话考虑字段拆分成多个字段;(尽量不用模糊匹配)
3. 使用索引的话注意索引是否生效.

破烂世界毁灭吧操 | 园豆:140 (初学一级) | 2023-05-12 17:49

几万条数据应该压力不大的

支持(0) 反对(0) 破烂世界毁灭吧操 | 园豆:140 (初学一级) | 2023-05-12 17:50

@supper李狗嗨: 谢谢

支持(0) 反对(0) wewehahayuyu | 园豆:30 (初学一级) | 2023-05-22 11:10
0
  1. inner join 的方式改下试试
    例如
    inner join (select g0.Id from gy_user as go where NOT(go.IsDeleted)) as t on g.checkInUserId=t.Id
    改为
    inner join gy_user as t on t.IsDeleted=0 and g.checkInUserId=t.Id

  2. inner join on 的那些列加上索引(g.checkInUserId、t.Id、...)

izan | 园豆:205 (菜鸟二级) | 2023-05-13 10:58

谢谢

支持(0) 反对(0) wewehahayuyu | 园豆:30 (初学一级) | 2023-05-22 11:10
0
  1. 建立索引:对于连接条件中使用的列(如 CheckInUserId,BedId 和 UserId),建立适当的索引可以加快查询速度。可以使用 SQL 的 CREATE INDEX 语句来创建索引。

  2. 避免在 JOIN 之前使用子查询:在原始查询中,我们在 INNER JOIN 子句之前进行了子查询,这可能会影响查询速度。相反,可以使用多个 INNER JOIN 或 LEFT JOIN 子句将所需的数据组合在一起,以避免性能问题。

  3. 限制返回的列数:仅选择需要的列,而不是所有可用列,可以减少数据库读取和处理的数据量,从而提高查询速度。

  4. 确保表具有正确的结构:将表中的数据分解为更小、更规范的部分可以使查询更容易优化并更快地执行。例如,可以将一些不常用或历史数据拆分到单独的表中。

  5. 如需要可私聊后付费远程解决。
Biuget-Golang | 园豆:784 (小虾三级) | 2023-05-15 15:07

谢谢

支持(0) 反对(0) wewehahayuyu | 园豆:30 (初学一级) | 2023-05-22 11:10
0

条件放错位置了,老弟。userid是关联字段吧,那like条件放最后就可以了。
select *
from a
join b on ...
join c on ...
join d on ...
where d.College_Cur_Number LIKE ...

LiveCoding | 园豆:502 (小虾三级) | 2023-05-22 11:07

谢谢

支持(0) 反对(0) wewehahayuyu | 园豆:30 (初学一级) | 2023-05-22 11:10
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册