一、用法

1. 与IN结合使用

sql中表连接和子查询哪个更快(SQL优化三)(1)

sql中表连接和子查询哪个更快(SQL优化三)(2)

性能分析:数据集合 O(N)线性时间复杂度

2. 与EXISTS结合使用

mySQL> select * from t_user where exists (select * from t_order where t_user.id=t_order.user_id and t_order. buy_date=curdate()); ---- ------ ---------------------------------- ------------ -------- | id | name | password | email | phone | ---- ------ ---------------------------------- ------------ -------- | 2 | xyz2 | 5838eec5e44b83f35c2763382b45e469 | 456@qq.com | 456789 | ---- ------ ---------------------------------- ------------ -------- 1 row in set (0.00 sec)

mysql> explain select * from t_user where exists (select * from t_order where t_user.id=t_order.user_id and t_order. buy_date=curdate()); ---- -------------------- --------- ------------ ------ ----------------------------------------------- -------------- --------- ------- ------ ---------- ------------- | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | ---- -------------------- --------- ------------ ------ ----------------------------------------------- -------------- --------- ------- ------ ---------- ------------- | 1 | PRIMARY | t_user | NULL | ALL | NULL | NULL | NULL | NULL | 1 | 100.00 | Using where | | 2 | DEPENDENT SUBQUERY | t_order | NULL | ref | idx_user_id,idx_user_id_buy_date,idx_buy_date | idx_buy_date | 3 | const | 1 | 25.00 | Using where | ---- -------------------- --------- ------------ ------ ----------------------------------------------- -------------- --------- ------- ------ ---------- ------------- 2 rows in set, 2 warnings (0.00 sec)

性能分析:True或False的boolean值 O(1)常量时间复杂度

二、优化方法

1. 使用EXISTS替代IN

2. 使用JOIN替代子查询

sql中表连接和子查询哪个更快(SQL优化三)(3)

3. 子查询和JOIN均不用,程序控制

,