了解 MySQL 中 EXPLAIN 的结果
Understanding the result of EXPLAIN in MySQL
我有两个独立的查询,它们的输出相同。现在我想知道哪个更好?
查询 1:
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
|----|-------------|-------|------|---------------|--------|---------|--------|------|----------------------------------------------------|
| 1 | SIMPLE | t1 | ALL | (null) | (null) | (null) | (null) | 9 | Using where |
| 1 | SIMPLE | t2 | ALL | (null) | (null) | (null) | (null) | 9 | Using where; Using join buffer (Block Nested Loop) |
查询 2:
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
|----|--------------------|-------|------|---------------|--------|---------|--------|------|-------------|
| 1 | PRIMARY | t1 | ALL | (null) | (null) | (null) | (null) | 9 | Using where |
| 2 | DEPENDENT SUBQUERY | t2 | ALL | (null) | (null) | (null) | (null) | 9 | Using where |
那么哪个更好,为什么?
我读到 EXPLAIN
here,但我仍然不知道哪个参数重要?或者哪个参数告诉我这样的列需要索引,或者我的查询需要优化?
在上面的两个解释结果中,所有列都相同,除了:select_type
和 extra
。那么哪个更好:
SIMPLE
, SIMPLE
PRIMARY
, DEPENDENT SUBQUERY
Using where
, Using where; Using join buffer (Block Nested Loop)
Using where
, Using where
编辑: 这是这两个查询:
查询 1:
SELECT t2.color FROM mytable t1
JOIN mytable t2 ON t1.related = t2.id
WHERE t1.id = '4'
查询 2:
SELECT t1.color FROM mytable t1
WHERE exists (select 1 from mytable t2
where t1.id = t2.related
and t2.id ='4')
重要的是这次时间是possible keys: NULL
。也就是说,您没有索引。由于 table 只有大约 9 行,这不是性能问题。然而。该查询将命中大约 9*9 = 81 行。如果您的 table 达到 1000 行,那么将有 1000000 行命中 return 结果集。
使用数据库的第一步是了解键(索引)。
使用适当的索引,此查询应该触及大约 2 行,无论 table.
的大小如何
您可能需要 PRIMARY KEY(id)
。如果您提供 SHOW CREATE TABLE mytable
.
会对我们有帮助
A quick lesson on building indexes
了解 EXPLAIN
需要索引方面的基础知识。现在讨论 EXPLAIN
的意思还为时过早。
我有两个独立的查询,它们的输出相同。现在我想知道哪个更好?
查询 1:
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
|----|-------------|-------|------|---------------|--------|---------|--------|------|----------------------------------------------------|
| 1 | SIMPLE | t1 | ALL | (null) | (null) | (null) | (null) | 9 | Using where |
| 1 | SIMPLE | t2 | ALL | (null) | (null) | (null) | (null) | 9 | Using where; Using join buffer (Block Nested Loop) |
查询 2:
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
|----|--------------------|-------|------|---------------|--------|---------|--------|------|-------------|
| 1 | PRIMARY | t1 | ALL | (null) | (null) | (null) | (null) | 9 | Using where |
| 2 | DEPENDENT SUBQUERY | t2 | ALL | (null) | (null) | (null) | (null) | 9 | Using where |
那么哪个更好,为什么?
我读到 EXPLAIN
here,但我仍然不知道哪个参数重要?或者哪个参数告诉我这样的列需要索引,或者我的查询需要优化?
在上面的两个解释结果中,所有列都相同,除了:select_type
和 extra
。那么哪个更好:
SIMPLE
,SIMPLE
PRIMARY
,DEPENDENT SUBQUERY
Using where
,Using where; Using join buffer (Block Nested Loop)
Using where
,Using where
编辑: 这是这两个查询:
查询 1:
SELECT t2.color FROM mytable t1
JOIN mytable t2 ON t1.related = t2.id
WHERE t1.id = '4'
查询 2:
SELECT t1.color FROM mytable t1
WHERE exists (select 1 from mytable t2
where t1.id = t2.related
and t2.id ='4')
重要的是这次时间是possible keys: NULL
。也就是说,您没有索引。由于 table 只有大约 9 行,这不是性能问题。然而。该查询将命中大约 9*9 = 81 行。如果您的 table 达到 1000 行,那么将有 1000000 行命中 return 结果集。
使用数据库的第一步是了解键(索引)。
使用适当的索引,此查询应该触及大约 2 行,无论 table.
的大小如何您可能需要 PRIMARY KEY(id)
。如果您提供 SHOW CREATE TABLE mytable
.
A quick lesson on building indexes
了解 EXPLAIN
需要索引方面的基础知识。现在讨论 EXPLAIN
的意思还为时过早。