Mysql 加快使用WHERE-id的查询速度
下面是一个大约需要5-6秒的查询。内部部分只需要大约50毫秒Mysql 加快使用WHERE-id的查询速度,mysql,sql,database,greatest-n-per-group,Mysql,Sql,Database,Greatest N Per Group,下面是一个大约需要5-6秒的查询。内部部分只需要大约50毫秒 SELECT id,messages.to,messages.from,message,datetime,messages.read FROM messages WHERE id IN( //inside brackets grabs a list of IDs SELECT max(messages.id) FROM (SELECT id,messages.from FROM messages
SELECT id,messages.to,messages.from,message,datetime,messages.read
FROM messages WHERE id IN( //inside brackets grabs a list of IDs
SELECT max(messages.id) FROM
(SELECT id,messages.from FROM messages
WHERE messages.to = 'username' AND messages.from != 'username'
UNION
SELECT id,messages.to FROM messages WHERE
messages.from = 'username' AND messages.to != 'username')
AS x
LEFT JOIN messages ON messages.id = x.id
GROUP BY x.from)
ORDER BY id DESC
LIMIT 15
这是一个查询,它提取最近有人发送消息的用户列表,以及两者之间的最后一条消息。我怎样才能改变它,使它更快?也许没有身份证。可能有多个查询?查询中的任何查询都可以转换为联接 在这种情况下,您需要将此查询从
SELECT * from TABLE where attr IN (SUBQUERY)
到
主要的挑战是不执行for循环类型的子查询,因为对于外部查询中的每个元组,都会执行内部查询。如果有很多元组,结果是innerquery执行了很多次
因此,请考虑只执行一次子查询。例如,在本例中,进行一个查询,返回每个消息id,其最大id只执行一次,然后连接到原始消息表
换句话说,不要考虑循环。根据需要加入的集合进行思考
哦,还有一件事我刚刚注意到。。。做一个内部查询,按id限制15从消息中选择id,并将其加入到消息中,而不是将限制15置于整个查询之外
如果限制超出范围,则将为消息中的每个元组计算查询。如果将限制移到内部,DBMS将在执行复杂查询的其余部分之前计算前15名,并且只执行15次!!!而不是表中的每个元组。
-dmg查询中的任何内容都可以转换为联接 在这种情况下,您需要将此查询从
SELECT * from TABLE where attr IN (SUBQUERY)
到
主要的挑战是不执行for循环类型的子查询,因为对于外部查询中的每个元组,都会执行内部查询。如果有很多元组,结果是innerquery执行了很多次
因此,请考虑只执行一次子查询。例如,在本例中,进行一个查询,返回每个消息id,其最大id只执行一次,然后连接到原始消息表
换句话说,不要考虑循环。根据需要加入的集合进行思考
哦,还有一件事我刚刚注意到。。。做一个内部查询,按id限制15从消息中选择id,并将其加入到消息中,而不是将限制15置于整个查询之外
如果限制超出范围,则将为消息中的每个元组计算查询。如果将限制移到内部,DBMS将在执行复杂查询的其余部分之前计算前15名,并且只执行15次!!!而不是表中的每个元组。
-dmg显示您的表格定义。还可以运行EXPLAIN,以便查看每个部件使用的索引。向我们展示Explain的输出,解释您为什么要对消息进行外部连接而不是内部连接?您的叙述中说,最近有人发送消息的用户列表,但您的查询中没有任何内容可以过滤结果给某人。@DanBracuk“用户名”过滤它如何显示您的表定义。还可以运行EXPLAIN,以便查看每个部件使用的索引。向我们展示Explain的输出,解释您为什么要对消息进行外部连接而不是内部连接?您的叙述中说,最近有人发送消息的用户列表,但您的查询中没有任何内容可以将结果过滤到其他人。@DanBracuk“用户名”过滤了它!我会试试这个。谢谢!我会试试这个。