能给出mysql子查询优化的案例吗
时间: 2023-07-25 14:23:12 浏览: 117
当MySQL子查询的结果集较大时,会导致性能问题,下面给出一个MySQL子查询优化案例。
原始SQL语句:
```
SELECT *
FROM orders
WHERE customer_id IN (
SELECT customer_id
FROM customers
WHERE first_name = 'John'
)
```
这个查询会返回与名为“John”的客户关联的所有订单。但是,如果子查询中匹配的客户数量很大,此查询可能会变得非常缓慢。
优化SQL语句:
```
SELECT o.*
FROM orders AS o
INNER JOIN customers AS c ON o.customer_id = c.customer_id
WHERE c.first_name = 'John'
```
这个查询使用 INNER JOIN 来连接订单和客户表,然后使用 WHERE 子句来过滤出客户名为“John”的订单。这个查询不使用子查询,而是直接连接两个表,因此可以避免子查询中的性能问题。
可以使用 EXPLAIN 关键字来查看查询计划,并确定查询是否使用了索引。下面是第二个查询的 EXPLAIN 输出:
```
+----+-------------+-------+------------+-------+---------------+---------+---------+----------------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+-------+---------------+---------+---------+----------------+------+----------+-------------+
| 1 | SIMPLE | c | NULL | const | PRIMARY | PRIMARY | 4 | const | 1 | 100.00 | Using index |
| 1 | SIMPLE | o | NULL | ref | customer_id | customer_id | 4 | sampledb.c.customer_id | 2 | 100.00 | NULL |
+----+-------------+-------+------------+-------+---------------+---------+---------+----------------+------+----------+-------------+
```
可以看到,查询使用了客户表的主键(PRIMARY)来过滤出名为“John”的客户,然后使用订单表的 customer_id 索引来过滤出相关订单。这个查询的性能比第一个查询要高得多。
阅读全文