mysql in 子查询优化
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语句实现的是一样的。
0
赞
热门推荐
-
2、 - 优质文章
-
3、 gate.io
-
8、 golang
-
9、 openharmony
-
10、 Vue中input框自动聚焦