2017-06-26 54 views
0

是否有可能提高此sql语句的速度?提高子查询sql语句的速度(mysql)

SELECT 
    (SELECT 
      time 
     FROM 
      log 
     WHERE 
      user_id = 'name' 
       AND category = 'Login' 
     ORDER BY time DESC 
     LIMIT 1 , 1) AS login_time, 
    (SELECT 
      time 
     FROM 
      log 
     WHERE 
      user_id = 'name' 
       AND category = 'Logout' 
       AND app = 'RES' 
     ORDER BY time DESC 
     LIMIT 1) AS res_logout_timea 

它目前需要10-16秒来完成和放慢我的应用程序,我可以做什么来提高效率?我正在考虑在左边加入同一个表格而不是使用子查询,但我无法获得语法。任何帮助,将不胜感激。谢谢

+0

更改使您的问题缺乏[mcve]。请不要删除您的代码。谢谢。 – Bugs

+0

有不同类型的子查询;我认为这不是https://stackoverflow.com/questions/30523739/rewriting-a-slow-sql-sub-query-in-join的重复。 (因此我的投票重新开放) –

回答

0

更妙的是

INDEX(user_id, category, time)  -- for the 1st subquery 
INDEX(user_id, category, app, time) -- for the 2nd subquery 

time列必须是最后一个;其他列的顺序无关紧要。您可能,例如,有这两个

INDEX(user_id, category, time)  -- for the 1st subquery 
INDEX(app, user_id, category, time) -- for the 2nd subquery 

以此来帮助那些需要开始app索引一些其他的查询。

0

你应该看看你的索引。可能丢失:user_id, category, app。 由于这两个查询只会返回一条记录,所以它应该非常快。

基本上,索引创建一个预先在几个字段上排序的参考表,这有助于数据库查找过滤或排序时的记录。当你不使用它们时,那​​个数据库正在进行中,这就是为什么你查询需要花费大量时间。

这里是从MySQL的官方文档指数: MySQL Indexes documentation

+0

它的工作,谢谢。你能简单地解释一下添加索引或提供一个有用的链接吗? – apex