mysql in 子查询优化

  • 2022-07-23
  • 浏览 (2662)

mysql 使用in的子查询在数据量少的时候不会有太大的性能问题,当数据量上来后会变得很慢,这里 设计 M * n 查询的问题。

先看一下例子:

update blog set status =1,updated_at=now() where id in (SELECT blog_id from book_blog_relation where book_id=10)

如果子查询和外部查询分别返回M和N行,那么该子查询被扫描为O(N+N*M),而不是O(N+M)。所以数据上来后会变得很慢。

因为存在M*N的原因造成慢查询,但是还是可以进行优化。

注意到慢的原因就是内部每次与外部比较时,都需要遍历一次表操作,可以采用另外一个方法,在嵌套一层子查询,避免多次遍历操作,语句如下:

explain update blog set status =1,updated_at=now() where id in (SELECT a.blog_id from (select blog_id from book_blog_relation where book_id=10)a)

同样的还是相关子查询,但是减少了内部遍历查询的操作。所以可以通过预查询来减少遍历操作,而提高效率。

其实在实际编程中,很多开发人员选择不使用连接表查询,而是自己先把数据从一张表中取出,再到另一张表中执行WHEREIN操作,这原理和上面SQL语句实现的是一样的。

参考:深入理解MySql子查询IN的执行和优化

0  赞