第一种方式:使用INNER JOIN。假设有users表和orders表,想查询每个用户最近的订单。
SELECT u.name, o.order_date FROM users u INNER JOIN orders o ON u.id = o.user_id WHERE o.order_date > '2023-01-01' ORDER BY o.order_date DESC LIMIT 10;
第二种方式:子查询实现联查
SELECT name, (SELECT order_date FROM orders WHERE user_id = users.id ORDER BY order_date DESC LIMIT 1) as last_order FROM users WHERE id IN (SELECT DISTINCT user_id FROM orders);
网友实测:JOIN比子查询快30%
在百万级数据下,测试环境MySQL 8.0,INNER JOIN执行时间0.2s,子查询0.28s,JOIN胜出明显,尤其索引优化后更高效。
实际案例:电商用户订单查询
表结构:user(id,name), order(user_id,amount,create_time)。用LEFT JOIN查所有用户订单总额:SELECT u.name, SUM(o.amount) FROM users u LEFT JOIN orders o ON u.id=o.user_id GROUP BY u.id;
子查询版本实测
SELECT u.name, (SELECT SUM(amount) FROM orders WHERE user_id=u.id) as total FROM users u; 小表快,大表JOIN更好,网友建议根据数据量选。
优化技巧分享
建联合索引:ALTER TABLE orders ADD INDEX idx_user_time (user_id, order_date); 联查速度提升5倍,实测无敌。
跨库联查注意
不同数据库用FEDERATED引擎,但慢,建议数据仓库统一库再JOIN,网友踩坑经验。
FAQ
Q: JOIN和子查询哪个更快?
A: 一般JOIN更快,尤其大数据,视索引而定。
Q: 怎么避免笛卡尔积?
A: 确保ON条件唯一匹配。
Q: 多表超过3个怎么联?
A: 逐步JOIN,别一次性太多。
Q: 性能慢咋办?
A: 加索引,EXPLAIN分析。