加文哥 2023-12-29 11:27 采纳率: 15.8%
浏览 7

以下sql表的数据量几万的 查询慢 哪里可以改进啊 !

业务:
1.查询每个用户登录表的 最大时间一条
2.user用户表
id VARCHAR
name VARCHAR
pwd 密码
3.user_login_info 用户登录表
id VARCHAR
user_id VARCHAR
create_time DATETIME

以下sql表的数据量几万的 查询慢 哪里可以改进啊 !
SELECT a*,b.create_time from user a
LEFT JOIN user_login_info b
on b.id = (SELECT id from user_login_info where a.id = b.user_id ORDER BY create_time desc limit 1)

  • 写回答

2条回答 默认 最新

  • 爱编程的鱼 2023-12-29 12:32
    关注

    这个查询语句的性能问题可能在于子查询的使用。在这个查询中,子查询会对每个用户执行一次,这会导致查询的时间复杂度为O(n^2),当数据量增加时,查询的时间会变慢。

    为了优化这个查询,可以考虑使用连接查询来代替子查询。具体地,你可以使用以下查询语句:

    SELECT a.*, b.create_time
    FROM user a
    LEFT JOIN (
      SELECT user_id, MAX(create_time) AS create_time
      FROM user_login_info
      GROUP BY user_id
    ) b ON a.id = b.user_id;
    

    这个查询语句使用了一个连接查询和一个子查询。子查询使用MAX函数来计算每个用户的最大登录时间,然后使用GROUP BY子句将结果按用户分组。连接查询将用户表和子查询的结果连接起来,以便将最大登录时间添加到每个用户的行中。

    这个查询语句的时间复杂度为O(nlogn),因为它使用了一个子查询和一个排序操作。这个查询语句应该比原来的查询语句更快,因为它只需要执行一次子查询,而不是对每个用户执行一次子查询。

    另外,你可以考虑创建索引来加速查询。在这个查询中,你可以为user_login_info表中的user_idcreate_time列创建联合索引,以便加速子查询和排序操作。在user表中,你可以为id列创建索引,以便加速连接操作。

    希望这些信息能对你有所帮助!

    评论

报告相同问题?

问题事件

  • 创建了问题 12月29日

悬赏问题

  • ¥15 WPF动态创建页面内容
  • ¥15 如何对TBSS的结果进行统计学的分析已完成置换检验,如何在最终的TBSS输出结果提取除具体值及如何做进一步相关性分析
  • ¥15 SQL数据库操作问题
  • ¥100 关于lm339比较电路出现的问题
  • ¥15 Matlab安装yalmip和cplex功能安装失败
  • ¥15 加装宝马安卓中控改变开机画面
  • ¥15 STK安装问题问问大家,这种情况应该怎么办
  • ¥15 关于罗技鼠标宏lua文件的问题
  • ¥15 halcon ocr mlp 识别问题
  • ¥15 已知曲线满足正余弦函数,根据其峰值,还原出整条曲线