Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 加快使用WHERE-id的查询速度_Mysql_Sql_Database_Greatest N Per Group - Fatal编程技术网

Mysql 加快使用WHERE-id的查询速度

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

下面是一个大约需要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
        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“用户名”过滤了它!我会试试这个。谢谢!我会试试这个。