工作上遇到的问题,比较简单的几张表关联查询。
【入住信息表】 关联【床位表】关联【人员信息表】 查询只需要2秒
如果再加上
【用户学院信息表】where 筛选指定几个学院编号下的用户 ID
查询就需要到12秒以上,客户现场到20秒以上。
本地数据量与现场一致,大约4万条。
也尝试过把【用户学院信息表】使用inner join 的方式过滤但,效率一样,且使用 where 的方式对代码改造比较好。
有时候2秒的查询也要花10秒,时快时慢,这是什么原因呢?
快一点的查询
加上过滤 要到12秒的查询
改为inner join 的方式查询
为什么加这个过滤,涉及数据权限限定,指定人员只能看到指定学院的下的入住住宿信息,学院编号College_Cur_Number 有规律,如 一级学院编号 000 ,其下一级学院就是0000001 。
如果有更好的 数据权限限制方式,设计方式,以及解决上面问题,麻烦指教下,谢谢了!可适当付费
个人拙见:
1.重要表(高频表)索引(Btree+)建立;
2. 用户学院信息 College_Cur_Number 字段添加索引 或者学院层级固定的话考虑字段拆分成多个字段;(尽量不用模糊匹配)
3. 使用索引的话注意索引是否生效.
几万条数据应该压力不大的
@supper李狗嗨: 谢谢
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
inner join on 的那些列加上索引(g.checkInUserId、t.Id、...)
谢谢
建立索引:对于连接条件中使用的列(如 CheckInUserId,BedId 和 UserId),建立适当的索引可以加快查询速度。可以使用 SQL 的 CREATE INDEX 语句来创建索引。
避免在 JOIN 之前使用子查询:在原始查询中,我们在 INNER JOIN 子句之前进行了子查询,这可能会影响查询速度。相反,可以使用多个 INNER JOIN 或 LEFT JOIN 子句将所需的数据组合在一起,以避免性能问题。
限制返回的列数:仅选择需要的列,而不是所有可用列,可以减少数据库读取和处理的数据量,从而提高查询速度。
确保表具有正确的结构:将表中的数据分解为更小、更规范的部分可以使查询更容易优化并更快地执行。例如,可以将一些不常用或历史数据拆分到单独的表中。
谢谢
条件放错位置了,老弟。userid是关联字段吧,那like条件放最后就可以了。
select *
from a
join b on ...
join c on ...
join d on ...
where d.College_Cur_Number LIKE ...
谢谢