Inner join在连接的时候会选取较小的表作为主表进行循环,减少循环的次数。Left join默认使用左表作为主表进行循环。
可能的原因是连接字段没有在大表上建索引,但是在小表上建了索引,而此时left join的左表是大表,在循环查找过程中走小表的索引,而此时inner join中小表为左表,在按连接字段值相等的情况下去查右表的情况下,不走右表的索引,所以导致inner join比left join慢。
在MySQL中,根据查询的复杂程度,使用内存循环或者MySQL Join可以有效提高查询效率。内存循环是指在MySQL中使用内存中的数据进行循环,而MySQL Join是指在MySQL中使用多个表之间的连接来查询数据。内存循环的优点是可以更快地查询数据,因为它只需要在内存中进行循环,而不需要在数据库中进行查询。但是,它的缺点是只能处理少量数据,而且它只能处理简单的查询,不能处理复杂的查询。
MySQL Join的优点是可以处理复杂的查询,因为它可以在多个表之间进行连接,从而查询出更多的数据。但是,它的缺点是查询效率较低,因为它需要在数据库中进行查询,而不是在内存中进行查询。
总的来说,在MySQL中,根据查询的复杂程度,使用内存循环或者MySQL Join可以有效提高查询效率。
EXISTS、IN与JOIN,都可以用来实现形如“查询A表中在(或不在)B表中的记录”的查询逻辑。在查询的两个表大小相当的情况下,3种查询方式的执行时间通常是:
EXISTS <= IN <= JOIN
NOT EXISTS <= NOT IN <= LEFT JOIN
只有当表中字段允许NULL时,NOT IN的方式最慢:
NOT EXISTS <= LEFT JOIN <= NOT IN
但是如果两个表中一个较小,一个较大,则子查询表大的用exists,子查询表小的用in,因为in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。而无论那个表大,用not exists都比not in要快。这是因为如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。
IN的好处是逻辑直观简单(通常是独立子查询);缺点是只能判断单字段,并且当NOT IN时效率较低,而且NULL会导致不想要的结果。
EXISTS的好处是效率高,可以判断单字段和组合字段,并不受NULL的影响;缺点是逻辑稍微复杂(通常是相关子查询)。
JOIN用在这种场合,往往是吃力不讨好。JOIN的用途是联接两个表,而不是判断一个表的记录是否在另一个表。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)