Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.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 限制在加入之前或之后有效吗?_Mysql_Performance_Join_Limit - Fatal编程技术网

Mysql 限制在加入之前或之后有效吗?

Mysql 限制在加入之前或之后有效吗?,mysql,performance,join,limit,Mysql,Performance,Join,Limit,这是一个简单的问题-我只是找到了不同的答案,所以我不确定。让我描述一下: 如果您有一个查询,如以下查询: 选择logins.timestamp,users.name 从登录 左加入用户 ON users.id=logins.user\u id 限制10 这基本上会列出logins表的最后10个条目,通过连接将用户id替换为用户名 现在我的问题是,当连接发生时,限制是否生效,以便它只连接前10个条目,还是在连接之后?它将连接整个表,然后删除前10个条目 我问这个问题是因为示例表登录将有许多条目,而

这是一个简单的问题-我只是找到了不同的答案,所以我不确定。让我描述一下:

如果您有一个查询,如以下查询:

选择logins.timestamp,users.name 从登录 左加入用户 ON users.id=logins.user\u id 限制10 这基本上会列出logins表的最后10个条目,通过连接将用户id替换为用户名

现在我的问题是,当连接发生时,限制是否生效,以便它只连接前10个条目,还是在连接之后?它将连接整个表,然后删除前10个条目

我问这个问题是因为示例表登录将有许多条目,而且我不确定联接在性能方面是否代价太高。若限制只发生在10个连接的情况下,那个就不成问题了


由此产生的第二个问题是:如果添加了DISTINCT,功能是否相同?它还会在10个条目处停止吗?不,这不是按订单人订购的。

别担心。这个限制将在连接的同时发生:MySQL不会读取整个logins表,而是每次对用户逐行进行连接,直到找到10行


请注意,如果一个users.id在表中出现两次,则联接将复制logins行并添加每个users行。行的总数仍然是10,但您将有9个登录。

这基本上会列出登录表的最后10个条目-不,不会。No ORDER BY子句=不保证排序。@Dcoder但“默认”排序受表插入的影响,对吗?因此,如果您假设您永远不会更新任何行,而只更新INSERT,那么顺序将始终是INSERT顺序,对吗对于这个问题,我只将该表用作历史记录表,而不在以后的任何时候操作数据据我所知,每个供应商都可以根据自己的需要实施默认排序,因此,结果通常会根据查询中使用的任何索引进行排序-这样引擎就不需要花费任何额外的时间进行排序。如何在加入前执行限制:+1。据我所知,您是对的,但它可能是特定于实现的。例如,如果没有ORDERBY子句,则可能有人实现了一个引擎,该引擎可能在执行联接时执行限制。我不知道这样的事情,这只是一个想法:。引擎确实可以指定自己的行为。对于订货人,限制总是在订单之后完成。您需要一个连接where order select字段的键。谢谢您的回答-是的,order by可能会更改此问题的结果对我来说很清楚-但我不会使用该键,因为我已经按照正确的日期顺序插入了行。我现在有了第二个棘手的问题-DISTINCT是什么?我将编辑我的问题-如果可以,请回答,但我现在无论如何都会接受这个答案,因为我需要知道的正是Distinct是相同的:它将逐行输入,丢弃重复项,直到剩下10行。它将在发送10行后停止。