Mysql之exists和inner join效率问题(1)

使用两张大小差距比较大的表来进行测试

前言:在使用laravel的过程中发现whereHas实现的方式是exists子查询,又听说exists尽量少使用,容易导致慢查询,于是就有了接下来两篇文章。

两张表结构如下:

app_userMysql之exists和inner join效率问题(1)_第1张图片

Mysql之exists和inner join效率问题(1)_第2张图片

app_feedback(user_id列建立索引)

Mysql之exists和inner join效率问题(1)_第3张图片

Mysql之exists和inner join效率问题(1)_第4张图片

很明显app_user表要比app_feedback表要大

----------------------------------------------------------------------------------------------------------------------------

测试方案1:

大表驱动小表(要大表数据)

Exists

SQL:Mysql之exists和inner join效率问题(1)_第5张图片

结果:

超过30s没出来结果......

查询计划:

驱动表全表扫描,被驱动表使用索引

Mysql之exists和inner join效率问题(1)_第6张图片

Inner join

SQL:

Mysql之exists和inner join效率问题(1)_第7张图片

结果:

查询计划:

驱动表关联时使用上了关联字段索引,被驱动表全表扫描

----------------------------------------------------------------------------------------------------------------------------

测试方案2:

小表驱动大表(要小表数据)

Exists

SQL:

Mysql之exists和inner join效率问题(1)_第8张图片

结果:

查询计划:

两个表都使用上了索引

Mysql之exists和inner join效率问题(1)_第9张图片

Inner join

SQL:

Mysql之exists和inner join效率问题(1)_第10张图片

结果:

查询计划:

两个表都使用上了索引

 

从上面的测试结果来看,当两张表一大一小时,

小表驱动大表时,无论是是exists和inner join效率差距不大;但是当大表驱动小表时,inner join效率明显高于exists

结论:两张表大小差距比较大时,inner join比exists效率更高

你可能感兴趣的:(MySQL)