提高子查询sql语句的速度(mysql)
问题描述:
是否有可能提高此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秒来完成和放慢我的应用程序,我可以做什么来提高效率?我正在考虑在左边加入同一个表格而不是使用子查询,但我无法获得语法。任何帮助,将不胜感激。谢谢
答
更妙的是
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
索引一些其他的查询。
答
你应该看看你的索引。可能丢失:user_id, category, app
。 由于这两个查询只会返回一条记录,所以它应该非常快。
基本上,索引创建一个预先在几个字段上排序的参考表,这有助于数据库查找过滤或排序时的记录。当你不使用它们时,那个数据库正在进行中,这就是为什么你查询需要花费大量时间。
这里是从MySQL的官方文档指数: MySQL Indexes documentation
+0
它的工作,谢谢。你能简单地解释一下添加索引或提供一个有用的链接吗? – apex
更改使您的问题缺乏[mcve]。请不要删除您的代码。谢谢。 – Bugs
有不同类型的子查询;我认为这不是https://stackoverflow.com/questions/30523739/rewriting-a-slow-sql-sub-query-in-join的重复。 (因此我的投票重新开放) –