Skip to content

Latest commit

ย 

History

History
455 lines (367 loc) ยท 36.2 KB

explain_02.md

File metadata and controls

455 lines (367 loc) ยท 36.2 KB

์‹คํ–‰ ๊ณ„ํš

์‹คํ–‰ ๊ณ„ํš ๋ถ„์„

mysql> explain
    -> select *
    -> from employees e
    -> inner join salaries s on s.emp_no=e.emp_no
    -> where first_name='ABC';
+----+-------------+-------+------------+------+----------------------+--------------+---------+--------------------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys        | key          | key_len | ref                | rows | filtered | Extra |
+----+-------------+-------+------------+------+----------------------+--------------+---------+--------------------+------+----------+-------+
|  1 | SIMPLE      | e     | NULL       | ref  | PRIMARY,ix_firstname | ix_firstname | 58      | const              |    1 |   100.00 | NULL  |
|  1 | SIMPLE      | s     | NULL       | ref  | PRIMARY              | PRIMARY      | 4       | employees.e.emp_no |    9 |   100.00 | NULL  |
+----+-------------+-------+------------+------+----------------------+--------------+---------+--------------------+------+----------+-------+
2 rows in set, 1 warning (0.00 sec)

MySQL 8.0 ๋ถ€ํ„ฐ๋Š” EXPLAIN ๋ช…๋ น ๊ฒฐ๊ณผ๋กœ ์ถœ๋ ฅ๋˜๋Š” ์‹คํ–‰ ๊ณ„ํš ํฌ๋งท์„ ๊ธฐ์กด ํ…Œ์ด๋ธ” ํฌ๋งท๊ณผ JSON, TREE ํ˜•ํƒœ๋กœ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค.
์•„๋ฌด๋Ÿฐ ์˜ต์…˜ ์—†์ด EXPLAIN ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด ์ฟผ๋ฆฌ ๋ฌธ์žฅ์˜ ํŠน์„ฑ์— ๋”ฐ๋ผ ํ‘œ ํ˜•ํƒœ๋กœ 1์ค„ ์ด์ƒ์˜ ๊ฒฐ๊ณผ๊ฐ€ ํ‘œ์‹œ๋œ๋‹ค.

ํ‘œ์˜ ๊ฐ ๋ ˆ์ฝ”๋“œ๋Š” ์ฟผ๋ฆฌ ๋ฌธ์žฅ์—์„œ ์‚ฌ์šฉ๋œ ํ…Œ์ด๋ธ”์˜ ๊ฐœ์ˆ˜๋งŒํผ ์ถœ๋ ฅ๋œ๋‹ค.
์‹คํ–‰ ๊ณ„ํš์€ ์œ„์—์„œ ์•„๋ž˜๋กœ ์ˆœ์„œ๋Œ€๋กœ ํ‘œ์‹œ๋œ๋‹ค.(UNION์ด๋‚˜ ์ƒ๊ด€ ์„œ๋ธŒ์ฟผ๋ฆฌ์˜ ๊ฒฝ์šฐ ์ˆœ์„œ๋Œ€๋กœ ํ‘œ์‹œ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ) ์ถœ๋ ฅ๋œ ์‹คํ–‰ ๊ณ„ํš์—์„œ ์œ„์ชฝ์— ์ถœ๋ ฅ๋œ ๊ฒฐ๊ณผ์ผ์ˆ˜๋ก ์ฟผ๋ฆฌ์˜ ๋ฐ”๊นฅ ๋ถ€๋ถ„์ด๊ฑฐ๋‚˜ ๋จผ์ € ์ ‘๊ทผํ•œ ํ…Œ์ด๋ธ”์ด๋‹ค.


๋ถ„์„ - id ์นผ๋Ÿผ

ํ•˜๋‚˜์˜ SELECT ๋ฌธ์žฅ์€ ๋‹ค์‹œ 1๊ฐœ ์ด์ƒ์˜ ํ•˜์œ„ SELECT ๋ฌธ์žฅ์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค.
์‹คํ–‰ ๊ณ„ํš์—์„œ ๊ฐ€์žฅ ์™ผ์ชฝ์— ํ‘œ์‹œ๋˜๋Š” id ์นผ๋Ÿผ์€ ๋‹จ์œ„ SELECT ์ฟผ๋ฆฌ๋ณ„๋กœ ๋ถ€์—ฌ๋˜๋Š” ์‹๋ณ„์ž ๊ฐ’์ด๋‹ค.

ํ•˜๋‚˜์˜ SELECT ๋ฌธ์žฅ ์•ˆ์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ…Œ์ด๋ธ”์„ ์กฐ์ธํ•˜๋ฉด ์กฐ์ธ๋˜๋Š” ํ…Œ์ด๋ธ”์˜ ๊ฐœ์ˆ˜๋งŒํผ ์‹คํ–‰ ๊ณ„ํš ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ถœ๋ ฅ๋˜์ง€๋งŒ ๊ฐ™์€ id ๊ฐ’์ด ๋ถ€์—ฌ๋œ๋‹ค.

mysql> explain
    -> select
    -> ( (select count(*) from employees) + (select count(*) from departments) ) as total_count;
+----+-------------+-------------+------------+-------+---------------+-------------+---------+------+--------+----------+----------------+
| id | select_type | table       | partitions | type  | possible_keys | key         | key_len | ref  | rows   | filtered | Extra          |
+----+-------------+-------------+------------+-------+---------------+-------------+---------+------+--------+----------+----------------+
|  1 | PRIMARY     | NULL        | NULL       | NULL  | NULL          | NULL        | NULL    | NULL |   NULL |     NULL | No tables used |
|  3 | SUBQUERY    | departments | NULL       | index | NULL          | ux_deptname | 162     | NULL |      9 |   100.00 | Using index    |
|  2 | SUBQUERY    | employees   | NULL       | index | NULL          | ix_hiredate | 3       | NULL | 299969 |   100.00 | Using index    |
+----+-------------+-------------+------------+-------+---------------+-------------+---------+------+--------+----------+----------------+
3 rows in set, 1 warning (0.00 sec)

์œ„ ์ฟผ๋ฆฌ์˜ ์‹คํ–‰ ๊ณ„ํš์˜ ๊ฒฝ์šฐ ์ฟผ๋ฆฌ ๋ฌธ์žฅ์ด 3๊ฐœ์˜ ๋‹จ์œ„ select ์ฟผ๋ฆฌ๋กœ ๊ตฌ์„ฑ๋ผ ์žˆ์œผ๋ฏ€๋กœ ์‹คํ–‰ ๊ณ„ํš์˜ ๊ฐ ๋ ˆ์ฝ”๋“œ๊ฐ€ ๊ฐ๊ธฐ ๋‹ค๋ฅธ id๊ฐ’์„ ์ง€๋‹Œ๋‹ค.

mysql> explain
    -> select * from dept_emp de
    -> where de.emp_no= (select e.emp_no
    -> from employees e
    -> where e.first_name='Georgi'
    -> and e.last_name='Facello' limit 1);
+----+-------------+-------+------------+------+-------------------+-------------------+---------+-------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys     | key               | key_len | ref   | rows | filtered | Extra       |
+----+-------------+-------+------------+------+-------------------+-------------------+---------+-------+------+----------+-------------+
|  1 | PRIMARY     | de    | NULL       | ref  | ix_empno_fromdate | ix_empno_fromdate | 4       | const |    1 |   100.00 | Using where |
|  2 | SUBQUERY    | e     | NULL       | ref  | ix_firstname      | ix_firstname      | 58      | const |  253 |    10.00 | Using where |
+----+-------------+-------+------------+------+-------------------+-------------------+---------+-------+------+----------+-------------+
2 rows in set, 1 warning (0.01 sec)

์ฃผ์˜ํ•  ์ ์€ ์‹คํ–‰ ๊ณ„ํš์˜ id ์นผ๋Ÿผ์ด ํ…Œ์ด๋ธ”์˜ ์ ‘๊ทผ ์ˆœ์„œ๋ฅผ ์˜๋ฏธํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์œ„ ์ฟผ๋ฆฌ๋Š” employees ํ…Œ์ด๋ธ”์„ ๋จผ์ € ์ฝ๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ dept_emp ํ…Œ์ด๋ธ”๊ณผ ์กฐ์ธํ•จ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  id๊ฐ€ ์ˆœ์„œ์™€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.


๋ถ„์„ - select_type ์นผ๋Ÿผ

select_type ์นผ๋Ÿผ์—์„œ๋Š” ๊ฐ ๋‹จ์œ„ select ์ฟผ๋ฆฌ๊ฐ€ ์–ด๋–ค ํƒ€์ž…์˜ ์ฟผ๋ฆฌ์ธ์ง€ ํ‘œ์‹œ๋˜๋Š” ์นผ๋Ÿผ์ด๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ’๋“ค์ด ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ๋‹ค.

  • SIMPLE
    • UNION์ด๋‚˜ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋‹จ์ˆœํ•œ SELECT ์ฟผ๋ฆฌ์˜ ๊ฒฝ์šฐ SIMPLE๋กœ ํ‘œ์‹œ๋œ๋‹ค(์กฐ์ธ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€).
    • ์ฟผ๋ฆฌ ๋ฌธ์žฅ์ด ์•„๋ฌด๋ฆฌ ๋ณต์žกํ•˜๋”๋ผ๋„ ์‹คํ–‰ ๊ณ„ํš์—์„œ SIMPLE์ธ ๋‹จ์œ„ SELECT ์ฟผ๋ฆฌ๋Š” ๋‹จ ํ•˜๋‚˜๋งŒ ์กด์žฌํ•œ๋‹ค.
    • ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ€์žฅ ๋ฐ”๊นฅ SELECT ์ฟผ๋ฆฌ๊ฐ€ SIMPLE๋กœ ํ‘œ์‹œ๋œ๋‹ค.
  • PRIMARY
    • UNION์ด๋‚˜ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ๊ฐ€์ง€๋Š” SELECT ์ฟผ๋ฆฌ์˜ ๊ฒฝ์šฐ ๊ฐ€์žฅ ๋ฐ”๊นฅ์ชฝ์— ์žˆ๋Š” ๋‹จ์œ„ SELECT ์ฟผ๋ฆฌ๋Š” PRIMARY๋กœ ํ‘œ์‹œ๋œ๋‹ค.
    • SIMPLE๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ PRIMARY์ธ ๋‹จ์œ„ SELECT ์ฟผ๋ฆฌ๋Š” ํ•˜๋‚˜๋งŒ ์กด์žฌํ•œ๋‹ค.
  • UNION
    • UINON์œผ๋กœ ๊ฒฐํ•ฉํ•˜๋Š” ๋‹จ์œ„ SELECT ์ฟผ๋ฆฌ ๊ฐ€์šด๋ฐ ์ฒซ ๋ฒˆ์งธ๋ฅผ ์ œ์™ธํ•œ ๋‘ ๋ฒˆ์งธ ์ดํ›„ ๋‹จ์œ„ SELECT ์ฟผ๋ฆฌ๋Š” UNION์œผ๋กœ ํ‘œ์‹œ๋œ๋‹ค.
    • UNION์˜ ์ฒซ ๋ฒˆ์งธ ๋‹จ์œ„ SELECT ์ฟผ๋ฆฌ๋Š” UNION์ด ์•„๋‹ˆ๋ผ UNION๋˜๋Š” ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋“ค์„ ๋ชจ์•„ ์ €์žฅํ•˜๋Š” ์ž„์‹œ ํ…Œ์ด๋ธ” DERIVED๊ฐ€ ํ‘œ์‹œ๋œ๋‹ค.
  • DEPENDENT_UNION
    • DEPENDENT๋ž€ UNION์ด๋‚˜ UNION ALL๋กœ ๊ฒฐํ•ฉ๋œ ๋‹จ์œ„ ์ฟผ๋ฆฌ๊ฐ€ ์™ธ๋ถ€ ์ฟผ๋ฆฌ์— ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
    • mysql> explain
      -> select *
      -> from employees e1 where e1.emp_no in (
      -> select e2.emp_no from employees e2 where e2.first_name='Matt'
      -> union
      -> select e3.emp_no from employees e3 where e3.last_name='Matt'
      -> );
      +----+--------------------+------------+------------+--------+----------------------+---------+---------+------+--------+----------+-----------------+
      | id | select_type        | table      | partitions | type   | possible_keys        | key     | key_len | ref  | rows   | filtered | Extra           |
      +----+--------------------+------------+------------+--------+----------------------+---------+---------+------+--------+----------+-----------------+
      |  1 | PRIMARY            | e1         | NULL       | ALL    | NULL                 | NULL    | NULL    | NULL | 299969 |   100.00 | Using where     |
      |  2 | DEPENDENT SUBQUERY | e2         | NULL       | eq_ref | PRIMARY,ix_firstname | PRIMARY | 4       | func |      1 |     5.00 | Using where     |
      |  3 | DEPENDENT UNION    | e3         | NULL       | eq_ref | PRIMARY              | PRIMARY | 4       | func |      1 |    10.00 | Using where     |
      |  4 | UNION RESULT       | <union2,3> | NULL       | ALL    | NULL                 | NULL    | NULL    | NULL |   NULL |     NULL | Using temporary |
      +----+--------------------+------------+------------+--------+----------------------+---------+---------+------+--------+----------+-----------------+
    • ์œ„ ์ฟผ๋ฆฌ์˜ ๊ฒฝ์šฐ ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์™ธ๋ถ€์˜ employees ํ…Œ์ด๋ธ”์„ ๋จผ์ € ์ฝ์€ ๋‹ค์Œ ์„œ๋ธŒ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋Š”๋ฐ, ์ด ๋•Œ employees ํ…Œ์ด๋ธ”์˜ ์นผ๋Ÿผ ๊ฐ’์ด ์„œ๋ธŒ์ฟผ๋ฆฌ์— ์˜ํ–ฅ์„ ์ค€๋‹ค.
    • ์ด๋ ‡๊ฒŒ ๋‚ด๋ถ€ ์ฟผ๋ฆฌ๊ฐ€ ์™ธ๋ถ€์˜ ๊ฐ’์„ ์ฐธ์กฐํ•ด์„œ ์ฒ˜๋ฆฌ๋  ๋•Œ DEPENDENT ํ‚ค์›Œ๋“œ๊ฐ€ ํ‘œ์‹œ๋œ๋‹ค.
    • ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” UNION์— ์‚ฌ์šฉ๋œ SELECT ์ฟผ๋ฆฌ์˜ WHERE ์กฐ๊ฑด์— e2.emp_no=e1.emp_no์™€ e3.emp_no=e1.emp_no๋ผ๋Š” ์กฐ๊ฑด์ด ์ž๋™์œผ๋กœ ์ถ”๊ฐ€๋˜์–ด ์‹คํ–‰๋œ๋‹ค.
    • ์™ธ๋ถ€์— ์ •์˜๋œ employees ํ…Œ์ด๋ธ”์˜ emp_no ์นผ๋Ÿผ์ด ์„œ๋ธŒ์ฟผ๋ฆฌ์— ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— DEPENDENT UNION์ด ํ‘œ์‹œ๋˜๋Š” ๊ฒƒ์ด๋‹ค.
  • UNION RESULT
    • UNION RESULT๋Š” UNION ๊ฒฐ๊ณผ๋ฅผ ๋‹ด์•„๋‘๋Š” ํ…Œ์ด๋ธ”์„ ์˜๋ฏธํ•œ๋‹ค.
    • 8.0 ๋ฒ„์ „๋ถ€ํ„ฐ UNION ALL์˜ ๊ฒฝ์šฐ ์ž„์‹œ ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ๊ธฐ๋Šฅ์ด ๊ฐœ์„ ๋์ง€๋งŒ, UNION(๋˜๋Š” UNION DISTINCT)์€ ์—ฌ์ „ํžˆ ์ž„์‹œ ํ…Œ์ด๋ธ”์— ๊ฒฐ๊ณผ๋ฅผ ๋ฒ„ํผ๋งํ•œ๋‹ค.
    • ์ด ์ž„์‹œ ํ…Œ์ด๋ธ”์„ ๊ฐ€๋ฆฌํ‚ค๋Š” select_type์ด UNION RESULT ์ด๊ณ , ์‹ค์ œ ์ฟผ๋ฆฌ์˜ ๋‹จ์œ„ ์ฟผ๋ฆฌ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„์˜ id ๊ฐ’์€ ๋ถ€์—ฌ๋˜์ง€ ์•Š๋Š”๋‹ค.
    • UNION ๋Œ€์‹  UNION ALL์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ํ•ด๋‹น ์‹คํ–‰ ๊ณ„ํš ๋ ˆ์ฝ”๋“œ๋Š” ๋ณด์ด์ง€ ์•Š๊ฒŒ ๋œ๋‹ค.
  • SUBQUERY
    • select_type์˜ SUBQUERY๋Š” FROM์ ˆ ์ด์™ธ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ๋งŒ์„ ์˜๋ฏธํ•œ๋‹ค.
    • MySQL ์„œ๋ฒ„์˜ ์‹คํ–‰ ๊ณ„ํš์—์„œ FROM ์ ˆ์— ์‚ฌ์šฉ๋œ ์„œ๋ธŒ์ฟผ๋ฆฌ๋Š” DERIVED๋กœ ํ‘œ์‹œ๋˜๊ณ , ๊ทธ ๋ฐ–์˜ ์œ„์น˜์—์„œ ์‚ฌ์šฉ๋œ ์„œ๋ธŒ์ฟผ๋ฆฌ๋Š” ์ „๋ถ€ SUBQUERY๋ผ๊ณ  ํ‘œ์‹œ๋œ๋‹ค.
    • ์„œ๋ธŒ์ฟผ๋ฆฌ๋Š” ์‚ฌ์šฉํ•˜๋Š” ์œ„์น˜์— ๋”ฐ๋ผ ๊ฐ๊ฐ ๋‹ค๋ฅธ ์ด๋ฆ„์„ ์ง€๋‹ˆ๊ณ  ์žˆ๋‹ค.
      • ์ค‘์ฒฉ๋œ ์ฟผ๋ฆฌ(Nested Query): SELECT๋˜๋Š” ์นผ๋Ÿผ์— ์‚ฌ์šฉ๋œ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ๋„ค์Šคํ‹ฐ๋“œ ์ฟผ๋ฆฌ๋ผ๊ณ  ํ•œ๋‹ค.
      • ์„œ๋ธŒ์ฟผ๋ฆฌ(Subquery): WHERE ์ ˆ์— ์‚ฌ์šฉ๋œ ๊ฒฝ์šฐ์—๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๊ทธ๋ƒฅ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ผ๊ณ  ํ•œ๋‹ค.
      • ํŒŒ์ƒ ํ…Œ์ด๋ธ”(Derived Query): FROM ์ ˆ์— ์‚ฌ์šฉ๋œ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ MySQL์—์„œ๋Š” ํŒŒ์ƒ ํ…Œ์ด๋ธ”์ด๋ผ๊ณ  ํ•˜๋ฉฐ, ์ผ๋ฐ˜์ ์œผ๋กœ RDBMS์—์„œ๋Š” ์ธ๋ผ์ธ ๋ทฐ, ๋˜๋Š” ์„œ๋ธŒ ์…€๋ ‰ํŠธ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
    • ๋˜ํ•œ ์„œ๋ธŒ์ฟผ๋ฆฌ๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ’์˜ ํŠน์„ฑ์— ๋”ฐ๋ผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌ๋ถ„ํ•˜๊ธฐ๋„ ํ•œ๋‹ค.
      • ์Šค์นผ๋ผ ์„œ๋ธŒ์ฟผ๋ฆฌ(Scalar Subquery): ํ•˜๋‚˜์˜ ๊ฐ’๋งŒ(์นผ๋Ÿผ์ด ๋‹จ ํ•˜๋‚˜์ธ ๋ ˆ์ฝ”๋“œ 1๊ฑด๋งŒ) ๋ฐ˜ํ™˜ํ•˜๋Š” ์ฟผ๋ฆฌ
      • ๋กœ์šฐ ์„œ๋ธŒ์ฟผ๋ฆฌ(Row Subquery): ์นผ๋Ÿผ์˜ ๊ฐœ์ˆ˜์™€ ๊ด€๊ณ„์—†์ด ํ•˜๋‚˜์˜ ๋ ˆ์ฝ”๋“œ๋งŒ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ฟผ๋ฆฌ
  • DEPENDENT SUBQUERY
    • ์„œ๋ธŒ์ฟผ๋ฆฌ๊ฐ€ ๋ฐ”๊นฅ์ชฝ SELECT ์ฟผ๋ฆฌ์—์„œ ์ •์˜๋œ ์นผ๋Ÿผ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ DEPENDENT SUBQUERY๋ผ๊ณ  ํ‘œ์‹œ๋œ๋‹ค.
    • mysql> explain
      -> select e.first_name,
      -> (select count(*)
      -> from dept_emp de, dept_manager dm
      -> where dm.dept_no=de.dept_no and de.emp_no=e.emp_no) as cnt
      -> from employees e
      -> where e.first_name='Matt';
      +----+--------------------+-------+------------+------+---------------------------+-------------------+---------+----------------------+------+----------+-------------+
      | id | select_type        | table | partitions | type | possible_keys             | key               | key_len | ref                  | rows | filtered | Extra       |
      +----+--------------------+-------+------------+------+---------------------------+-------------------+---------+----------------------+------+----------+-------------+
      |  1 | PRIMARY            | e     | NULL       | ref  | ix_firstname              | ix_firstname      | 58      | const                |  233 |   100.00 | Using index |
      |  2 | DEPENDENT SUBQUERY | de    | NULL       | ref  | PRIMARY,ix_empno_fromdate | ix_empno_fromdate | 4       | employees.e.emp_no   |    1 |   100.00 | Using index |
      |  2 | DEPENDENT SUBQUERY | dm    | NULL       | ref  | PRIMARY                   | PRIMARY           | 16      | employees.de.dept_no |    2 |   100.00 | Using index |
      +----+--------------------+-------+------------+------+---------------------------+-------------------+---------+----------------------+------+----------+-------------+
    • ๋˜ํ•œ DEPENDENT UNION๊ณผ ๊ฐ™์ด DEPENDENT SUBQUERY ๋˜ํ•œ ์™ธ๋ถ€ ์ฟผ๋ฆฌ๊ฐ€ ๋จผ์ € ์ˆ˜ํ–‰๋œ ํ›„ ์„œ๋ธŒ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋ผ์•ผ ํ•˜๋ฏ€๋กœ DEPENDENT ํ‚ค์›Œ๋“œ๊ฐ€ ์—†๋Š” ์ผ๋ฐ˜ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ณด๋‹ค๋Š” ์ฒ˜๋ฆฌ์†๋„๊ฐ€ ๋Š๋ฆด ๋•Œ๊ฐ€ ๋งŽ๋‹ค.
  • DERIVED
    • DERIVED๋Š” ๋‹จ์œ„ SELECT ์ฟผ๋ฆฌ์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋‚˜ ๋””์Šคํฌ์— ์ž„์‹œ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
    • 5.5 ๋ฒ„์ „๊นŒ์ง€๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ๊ฐ€ FROM์ ˆ์— ์‚ฌ์šฉ๋œ ๊ฒฝ์šฐ ํ•ญ์ƒ select_type์ด DERIVED์˜€์ง€๋งŒ, 5.6 ๋ฒ„์ „๋ถ€ํ„ฐ ์˜ตํ‹ฐ๋งˆ์ด์ € ์˜ต์…˜์— ๋”ฐ๋ผ FROM ์ ˆ์˜ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ์™ธ๋ถ€ ์ฟผ๋ฆฌ์™€ ํ†ตํ•ฉํ•˜๋Š” ํ˜•ํƒœ์˜ ์ตœ์ ํ™”๊ฐ€ ์ˆ˜ํ–‰๋˜๊ธฐ๋„ ํ•œ๋‹ค.
    • 5.5 ๋ฒ„์ „๊นŒ์ง€๋Š” ํŒŒ์ƒ ํ…Œ์ด๋ธ”์— ์ธ๋ฑ์Šค๊ฐ€ ์ „ํ˜€ ์—†์œผ๋ฏ€๋กœ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”๊ณผ ์กฐ์ธํ•  ๋•Œ ์„ฑ๋Šฅ์ƒ ๋ถˆ๋ฆฌํ•  ๋•Œ๊ฐ€ ๋งŽ์•˜๋Š”๋ฐ, 5.6 ๋ฒ„์ „๋ถ€ํ„ฐ ์˜ตํ‹ฐ๋งˆ์ด์ € ์˜ต์…˜์— ๋”ฐ๋ผ ์ฟผ๋ฆฌ์˜ ํŠน์„ฑ์— ๋งž๊ฒŒ ์ž„์‹œ ํ…Œ์ด๋ธ”์—๋„ ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ ์ตœ์ ํ™” ๋๋‹ค.
    • MySQL ์„œ๋ฒ„๋Š” ๋ฒ„์ „์ด ์—…๊ทธ๋ ˆ์ด๋“œ๋˜๋ฉด์„œ ์กฐ์ธ ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ์ตœ์ ํ™”๋Š” ๋งŽ์ด ์„ฑ์ˆ™๋œ ์ƒํƒœ์ด๋ฏ€๋กœ ํŒŒ์ƒ ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ์ตœ์ ํ™”๊ฐ€ ๋ถ€์กฑํ•œ MySQL ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉ ์ค‘์ผ ๊ฒฝ์šฐ, ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด DERIVED ํ˜•ํƒœ์˜ ์‹คํ–‰ ๊ณ„ํš์„ ์กฐ์ธ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ฟผ๋ฆฌ๋ฅผ ๋ฐ”๊ฟ”์ฃผ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
    • 8.0 ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” FROM ์ ˆ์˜ ์„œ๋ธŒ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ์ตœ์ ํ™”๋„ ๋งŽ์ด ๊ฐœ์„ ๋˜์–ด ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ๋ถˆํ•„์š”ํ•œ ์„œ๋ธŒ์ฟผ๋ฆฌ๋Š” ์กฐ์ธ์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์žฌ์ž‘์„ฑํ•ด์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค.
    • ์ฟผ๋ฆฌ๋ฅผ ํŠœ๋‹ํ•˜๊ธฐ ์œ„ํ•ด ์‹คํ–‰ ๊ณ„ํš์„ ํ™•์ธํ•  ๋•Œ ๊ฐ€์žฅ ๋จผ์ € select_type ์นผ๋Ÿผ์˜ ๊ฐ’์ด DERIVED์ธ ๊ฒƒ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.
      ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ์กฐ์ธ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด ์„œ๋ธŒ์ฟผ๋ฆฌ๋ณด๋‹ค๋Š” ์กฐ์ธ์„ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ๊ฐ•๋ ฅํžˆ ๊ถŒ์žฅํ•œ๋‹ค.
      
  • DEPENDENT DERIVED
    • 8.0 ์ด์ „ ๋ฒ„์ „์—์„œ๋Š” FROM ์ ˆ์˜ ์„œ๋ธŒ์ฟผ๋ฆฌ๋Š” ์™ธ๋ถ€ ์นผ๋Ÿผ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์—ˆ๋Š”๋ฐ, 8.0 ๋ฒ„์ „๋ถ€ํ„ฐ ๋ž˜ํ„ฐ๋Ÿด ์กฐ์ธ(LATERAL JOIN) ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.
    • DEPENDENT DERIVED ํ‚ค์›Œ๋“œ๋Š” ํ•ด๋‹น ํ…Œ์ด๋ธ”์ด ๋ž˜ํ„ฐ๋Ÿด ์กฐ์ธ์œผ๋กœ ์‚ฌ์šฉ๋œ ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
  • UNCACHEABLE SUBQUERY
    • ํ•˜๋‚˜์˜ ์ฟผ๋ฆฌ ๋ฌธ์žฅ์— ์„œ๋ธŒ ์ฟผ๋ฆฌ๊ฐ€ ํ•˜๋‚˜๋งŒ ์žˆ๋”๋ผ๋„ ์‹ค์ œ๋กœ ๊ทธ ์„œ๋ธŒ์ฟผ๋ฆฌ๊ฐ€ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋˜๋Š”๊ฒŒ ์•„๋‹˜
    • ๊ทธ๋Ÿฐ๋ฐ ์กฐ๊ฑด์ด ๋˜‘๊ฐ™์€ ์„œ๋ธŒ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋  ๋•Œ๋Š” ๋‹ค์‹œ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ์ด์ „์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ์„œ๋ธŒ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋‚ด๋ถ€์ ์ธ ์บ์‹œ ๊ณต๊ฐ„์— ๋‹ด์•„๋‘”๋‹ค.
    • select_type์ด SUBQUERY์ธ ๊ฒฝ์šฐ์™€ UNCACHEABLE SUBQUERY๋Š” ์ด ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š๋ƒ ์—†๋Š๋ƒ์˜ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.
    • ์„œ๋ธŒ์ฟผ๋ฆฌ์— ํฌํ•จ๋œ ์š”์†Œ์— ์˜ํ•ด ์บ์‹œ ์ž์ฒด๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•  ์ˆ˜๊ฐ€ ์žˆ๋Š”๋ฐ, ๊ทธ๋Ÿด ๊ฒฝ์šฐ select_type์ด UNCACHEABLE SUBQUERY๋กœ ํ‘œ์‹œ๋œ๋‹ค.
  • UNCACHEABLE UNION
  • MATERIALIZED
    • ์ฃผ๋กœ FROM ์ ˆ์ด๋‚˜ IN ํ˜•ํƒœ์˜ ์ฟผ๋ฆฌ์— ์‚ฌ์šฉ๋œ ์„œ๋ธŒ์ฟผ๋ฆฌ์˜ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.
    • mysql> explain
      -> select *
      -> from employees e
      -> where e.emp_no in (select emp_no from salaries where salary between 100 and 1000);
      +----+--------------+-------------+------------+--------+-------------------+-----------+---------+--------------------+------+----------+--------------------------+
      | id | select_type  | table       | partitions | type   | possible_keys     | key       | key_len | ref                | rows | filtered | Extra                    |
      +----+--------------+-------------+------------+--------+-------------------+-----------+---------+--------------------+------+----------+--------------------------+
      |  1 | SIMPLE       | <subquery2> | NULL       | ALL    | NULL              | NULL      | NULL    | NULL               | NULL |   100.00 | NULL                     |
      |  1 | SIMPLE       | e           | NULL       | eq_ref | PRIMARY           | PRIMARY   | 4       | <subquery2>.emp_no |    1 |   100.00 | NULL                     |
      |  2 | MATERIALIZED | salaries    | NULL       | range  | PRIMARY,ix_salary | ix_salary | 4       | NULL               |    1 |   100.00 | Using where; Using index |
      +----+--------------+-------------+------------+--------+-------------------+-----------+---------+--------------------+------+----------+--------------------------+
      3 rows in set, 1 warning (0.00 sec)

๋ถ„์„ - table ์นผ๋Ÿผ

MySQL ์„œ๋ฒ„์˜ ์‹คํ–‰ ๊ณ„ํš์€ ๋‹จ์œ„ SELECT ์ฟผ๋ฆฌ ๊ธฐ์ค€์ด ์•„๋‹ˆ๋ผ ํ…Œ์ด๋ธ” ๊ธฐ์ค€์œผ๋กœ ํ‘œ์‹œ๋œ๋‹ค.
ํ…Œ์ด๋ธ”์˜ ์ด๋ฆ„์— ๋ณ„์นญ์ด ๋ถ€์—ฌ๋œ ๊ฒฝ์šฐ์—๋Š” ๋ณ„์นญ์ด ํ‘œ์‹œ๋œ๋‹ค.

mysql> explain select now();
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra          |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+
|  1 | SIMPLE      | NULL  | NULL       | NULL | NULL          | NULL | NULL    | NULL | NULL |     NULL | No tables used |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+

mysql> explain select now() from dual;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra          |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+
|  1 | SIMPLE      | NULL  | NULL       | NULL | NULL          | NULL | NULL    | NULL | NULL |     NULL | No tables used |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+

์‹ค์ œ DUAL์ด๋ผ๋Š” ํ…Œ์ด๋ธ”์€ ์—†์ง€๋งŒ ์˜ค๋ผํด RDBMS์— ์ต์ˆ™ํ•œ ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด MySQL ์„œ๋ฒ„๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ DUAL์ด๋ผ๋Š” ํ…Œ์ด๋ธ”์ด ์žˆ๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ ์ž‘๋™ํ•œ๋‹ค.
์˜ค๋ผํด RDBMS์—์„œ๋Š” FROM ์ ˆ์ด ์—†์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€๋งŒ MySQL ์„œ๋ฒ„๋Š” ๊ทธ๋ ‡์ง€ ์•Š๋‹ค.
๋ณ„๋„์˜ ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” SELECT ์ฟผ๋ฆฌ์ธ ๊ฒฝ์šฐ ์œ„์™€ ๊ฐ™์ด NULL์ด ํ‘œ์‹œ๋œ๋‹ค.

<derived N> ๋˜๋Š” <union M,N>๊ณผ ๊ฐ™์ด <>๋กœ ๋‘˜๋Ÿฌ์‹ธ์ธ ํ…Œ์ด๋ธ”์€ ์ž„์‹œ ํ…Œ์ด๋ธ”์„ ์˜๋ฏธํ•œ๋‹ค.
๋งŒ์•ฝ <derived 2>์ด๋ฉด ๋‹จ์œ„ SELECT ์ฟผ๋ฆฌ์˜ id ๊ฐ’์ด 2์ธ ์‹คํ–‰ ๊ณ„ํš์œผ๋กœ๋ถ€ํ„ฐ ๋งŒ๋“ค์–ด์ง„ ํŒŒ์ƒ ํ…Œ์ด๋ธ”์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

+----+-------------+------------+------------+--------+---------------------------------------+-------------------+---------+-----------+--------+----------+-------------+
| id | select_type | table      | partitions | type   | possible_keys                         | key               | key_len | ref       | rows   | filtered | Extra       |
+----+-------------+------------+------------+--------+---------------------------------------+-------------------+---------+-----------+--------+----------+-------------+
|  1 | PRIMARY     | <derived2> | NULL       | ALL    | NULL                                  | NULL              | NULL    | NULL      | 331143 |   100.00 | NULL        |
|  1 | PRIMARY     | e          | NULL       | eq_ref | PRIMARY                               | PRIMARY           | 4       | tb.emp_no |      1 |   100.00 | NULL        |
|  2 | DERIVED     | de         | NULL       | index  | PRIMARY,ix_fromdate,ix_empno_fromdate | ix_empno_fromdate | 7       | NULL      | 331143 |   100.00 | Using index |
+----+-------------+------------+------------+--------+---------------------------------------+-------------------+---------+-----------+--------+----------+-------------+
  • ์ฒซ ๋ฒˆ์งธ ๋ผ์ธ์˜ ํ…Œ์ด๋ธ”์ด ๋ผ๋Š” ๊ฒƒ์„ ๋ณด์•„ ์ด ๋ผ์ธ๋ณด๋‹ค id ๊ฐ’์ด 2์ธ ๋ผ์ธ์ด ๋จผ์ € ์‹คํ–‰๋˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๊ฐ€ ํŒŒ์ƒ ํ…Œ์ด๋ธ”๋กœ ์ค€๋น„๋ผ์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
  • id ๊ฐ’์ด 2์ธ ๋ผ์ธ์„ ๋ณด๋ฉด select_type์ด derived์ด๊ณ , table์ด de์ธ ํ…Œ์ด๋ธ”์„ ์ฝ์–ด์„œ ํŒŒ์ƒ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
  • ์ฒซ ๋ฒˆ์งธ ๋ผ์ธ๊ณผ ๋‘ ๋ฒˆ์งธ ๋ผ์ธ์ด ๊ฐ™์€ id ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ด์„œ ์™€ e ํ…Œ์ด๋ธ”์ด ์กฐ์ธ๋˜๋Š” ์ฟผ๋ฆฌ๋ผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
  • ๊ทธ๋Ÿฐ๋ฐ ํ…Œ์ด๋ธ”์ด e ํ…Œ์ด๋ธ”๋ณด๋‹ค ๋จผ์ € ํ‘œ์‹œ๋๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€ ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”์ด ๋˜๊ณ , e ํ…Œ์ด๋ธ”์ด ๋“œ๋ฆฌ๋ธ ํ…Œ์ด๋ธ”์ด ๋˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
  • ์ฆ‰ ํ…Œ์ด๋ธ”์„ ๋จผ์ € ์ฝ๊ณ  e ํ…Œ์ด๋ธ”๋กœ ์กฐ์ธ์„ ์‹คํ–‰ํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
mysql> explain
    -> select *
    -> from (select de.emp_no from dept_emp de group by de.emp_no) tb, employees e
    -> where e.emp_no=tb.emp_no;

๋ถ„์„ - partitions ์นผ๋Ÿผ

partitions ์ปฌ๋Ÿผ์„ ํ†ตํ•ด ํŒŒํ‹ฐ์…˜์ด ์—ฌ๋Ÿฌ ๊ฐœ์ธ ํ…Œ์ด๋ธ”์—์„œ ๋ถˆํ•„์š”ํ•œ ํŒŒํ‹ฐ์…˜์„ ์ œ์™ธํ•˜๊ณ , ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์ ‘๊ทผํ•ด์•ผ ํ•  ๊ฒƒ์œผ๋กœ ํŒ๋‹จ๋˜๋Š” ํ…Œ์ด๋ธ”๋งŒ ๊ณจ๋ผ๋‚ผ ์ˆ˜ ์žˆ๋‹ค.
์ด๋Ÿฌํ•œ ๊ณผ์ •์„ ํŒŒํ‹ฐ์…˜ ํ”„๋ฃจ๋‹์ด๋ผํ•œ๋‹ค.


๋ถ„์„ - type ์นผ๋Ÿผ

์ฟผ๋ฆฌ ์‹คํ–‰ ๊ณ„ํš์—์„œ type ์ดํ›„์˜ ์นผ๋Ÿผ์€ MySQL ์„œ๋ฒ„๊ฐ€ ๊ฐ ํ…Œ์ด๋ธ”์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ฝ์—ˆ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
์ผ๋ฐ˜์ ์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ํŠœ๋‹ํ•  ๋•Œ ์ธ๋ฑ์Šค๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋ฏ€๋กœ type ์นผ๋Ÿผ์€ ๋งค์šฐ ์ค‘์š”ํ•œ ์ •๋ณด

  • system
  • const
  • eq_ref
  • ref
  • fulltext
  • ref_or_null
  • unique_subquery
  • index_subquery
  • range
  • index_merge
  • index
  • ALL

์œ„ ์ ‘๊ทผ ๋ฐฉ๋ฒ• ์ค‘์—์„œ ALL์€ ํ’€ํ…Œ์ด๋ธ” ์Šค์บ”์„ ์˜๋ฏธํ•˜๊ณ , ๋‚˜๋จธ์ง€๋Š” ๋ชจ๋‘ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ ‘๊ทผ ๋ฐฉ๋ฒ•์ด๋‹ค.
๋˜ํ•œ ์„ฑ๋Šฅ์ด ๋น ๋ฅธ ์ˆœ์„œ๋Œ€๋กœ ๋‚˜์—ดํ•œ ๊ฒƒ์ด๋‹ค.

system

๋ ˆ์ฝ”๋“œ๊ฐ€ 1๊ฑด๋งŒ ์กด์žฌํ•˜๋Š” ํ…Œ์ด๋ธ” ๋˜๋Š” ํ•œ ๊ฑด๋„ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํ…Œ์ด๋ธ”์„ ์ฐธ์กฐํ•˜๋Š” ํ˜•ํƒœ์˜ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์„ system์ด๋ผ ํ•œ๋‹ค.

const

์ฟผ๋ฆฌ๊ฐ€ ํ”„๋ผ์ด๋จธ๋ฆฌ ํ‚ค๋‚˜ ์œ ๋‹ˆํฌ ํ‚ค ์นผ๋Ÿผ์„ ์ด์šฉํ•˜๋Š” where ์กฐ๊ฑด์ ˆ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ๋ฐ˜๋“œ์‹œ 1๊ฑด์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ฒ˜๋ฆฌ ๋ฐฉ์‹์„ const๋ผ๊ณ  ํ•œ๋‹ค.

๋‹ค์ค‘ ์นผ๋Ÿผ์œผ๋กœ ๊ตฌ์„ฑ๋œ ํ”„๋ผ์ด๋จธ๋ฆฌ ํ‚ค๋‚˜ ์œ ๋‹ˆํฌ ํ‚ค ์ค‘ ์ธ๋ฑ์Šค์˜ ์ผ๋ถ€ ์นผ๋Ÿผ๋งŒ ์กฐ๊ฑด์œผ๋กœ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ์—๋Š” const ํƒ€์ž…์˜ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
ํ”„๋ผ์ด๋จธ๋ฆฌ ํ‚ค์˜ ์ผ๋ถ€๋งŒ ์กฐ๊ฑด์œผ๋กœ ์‚ฌ์šฉํ•  ๋•Œ๋Š” const๊ฐ€ ์•„๋‹Œ ref๋กœ ํ‘œ์‹œ๋˜๊ณ , ๋ชจ๋“  ์นผ๋Ÿผ์„ ์กฐ๊ฑด์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด const ์ ‘๊ทผ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

MySQL์˜ ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์ฟผ๋ฆฌ๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ๋‹จ๊ณ„์—์„œ ์ฟผ๋ฆฌ๋ฅผ ๋จผ์ € ์‹คํ–‰ํ•ด์„œ ํ†ต์งธ๋กœ ์ƒ์ˆ˜ํ™”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— const์ด๋‹ค.
where first_name = (select first_name from employees e2 where emp_no=100001)
where first_name = 'Jasminko'๋กœ ์น˜ํ™˜๋œ๋‹ค.

eq_ref

eq_ref ์ ‘๊ทผ ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์ด ์กฐ์ธ๋˜๋Š” ์ฟผ๋ฆฌ์˜ ์‹คํ–‰๊ณ„ํš์—์„œ๋งŒ ํ‘œ์‹œ๋œ๋‹ค.
์กฐ์ธ์—์„œ ์ฒ˜์Œ ์ฝ์€ ํ…Œ์ด๋ธ”์˜ ์นผ๋Ÿผ๊ฐ’์„, ๊ทธ๋‹ค์Œ ์ฝ์–ด์•ผ ํ•  ํ…Œ์ด๋ธ”์˜ pk๋‚˜ ์œ ๋‹ˆํฌ ํ‚ค ์นผ๋Ÿผ์˜ ๊ฒ€์ƒ‰ ์กฐ๊ฑด์— ์‚ฌ์šฉํ•  ๋•Œ๋ฅผ ๊ฐ€๋ฆฌ์ผœ eq_ref๋ผ๊ณ  ํ•œ๋‹ค.
์ด ๋•Œ ๋‘ ๋ฒˆ์งธ ์ดํ›„์— ์ฝ๋Š” ํ…Œ์ด๋ธ”์˜ type ์นผ๋Ÿผ์— eq_ref๊ฐ€ ํ‘œ์‹œ๋œ๋‹ค.

๋‘ ๋ฒˆ์งธ ์ดํ›„์— ์ฝํžˆ๋Š” ํ…Œ์ด๋ธ”์„ ์œ ๋‹ˆํฌ ํ‚ค๋กœ ๊ฒ€์ƒ‰ํ•  ๋•Œ ๊ทธ ์œ ๋‹ˆํฌ ์ธ๋ฑ์Šค๋Š” NOT NULL์ด์–ด์•ผ ํ•˜๋ฉฐ, ๋‹ค์ค‘ ์นผ๋Ÿผ์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ํ”„๋ผ์ด๋จธ๋ฆฌ ํ‚ค๋‚˜ ์œ ๋‹ˆํฌ ์ธ๋ฑ์Šค๋ผ๋ฉด ๋ชจ๋“  ์นผ๋Ÿผ์ด ๋น„๊ต ์กฐ๊ฑด์— ์‚ฌ์šฉ๋ผ์•ผ๋งŒ eq_ref ์ ‘๊ทผ ๋ฐฉ๋ฒ•์ด ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.

์ฆ‰ ์กฐ์ธ์—์„œ ๋‘ ๋ฒˆ์งธ ์ดํ›„์— ์ฝ๋Š” ํ…Œ์ด๋ธ”์—์„œ ๋ฐ˜๋“œ์‹œ 1๊ฑด๋งŒ ์กด์žฌํ•œ๋‹ค๋Š” ๋ณด์žฅ์ด ์žˆ์–ด์•ผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ ‘๊ทผ ๋ฐฉ๋ฒ•์ด๋‹ค.

mysql> explain
    -> select * from dept_emp de, employees e
    -> where e.emp_no=de.emp_no AND de.dept_no='d005';
+----+-------------+-------+------------+--------+---------------------------+---------+---------+---------------------+--------+----------+-------+
| id | select_type | table | partitions | type   | possible_keys             | key     | key_len | ref                 | rows   | filtered | Extra |
+----+-------------+-------+------------+--------+---------------------------+---------+---------+---------------------+--------+----------+-------+
|  1 | SIMPLE      | de    | NULL       | ref    | PRIMARY,ix_empno_fromdate | PRIMARY | 16      | const               | 165571 |   100.00 | NULL  |
|  1 | SIMPLE      | e     | NULL       | eq_ref | PRIMARY                   | PRIMARY | 4       | employees.de.emp_no |      1 |   100.00 | NULL  |
+----+-------------+-------+------------+--------+---------------------------+---------+---------+---------------------+--------+----------+-------+
2 rows in set, 1 warning (0.00 sec)

employees ํ…Œ์ด๋ธ”์˜ emp_no๋Š” pk๋ผ์„œ ์กฐ๊ฑด์— ์ผ์น˜ํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๊ฐ€ 1๊ฑด๋งŒ ์กด์žฌํ•˜๋ฏ€๋กœ eq_ref๊ฐ€ ํ‘œ์‹œ๋˜๋Š” ๊ฒƒ

ref

ref ์ ‘๊ทผ ๋ฐฉ๋ฒ•์€ ์กฐ์ธ์˜ ์ˆœ์„œ์™€ ์ƒ๊ด€์—†์ด ์‚ฌ์šฉ๋˜๋ฉฐ pk, ์œ ๋‹ˆํฌ ํ‚ค ์กฐ๊ฑด๋„ ์—†๋‹ค.
์ธ๋ฑ์Šค ์ข…๋ฅ˜์™€ ์ƒ๊ด€์—†์ด ๋™๋“ฑ ์กฐ๊ฑด์œผ๋กœ ๊ฒ€์ƒ‰ํ•  ๋•Œ ref ์ ‘๊ทผ ๋ฐฉ๋ฒ•์ด ์‚ฌ์šฉ๋œ๋‹ค. ref ํƒ€์ž…์€ ๋ฐ˜ํ™˜๋˜๋Š” ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋ฐ˜๋“œ์‹œ 1๊ฑด์ด๋ผ๋Š” ๋ณด์žฅ์ด ์—†์œผ๋ฏ€๋กœ const๋‚˜ eq_ref๋ณด๋‹ค ๋น ๋ฅด์ง€ ์•Š๋‹ค. ํ•˜์ง€๋งŒ ๋™๋“ฑ ์กฐ๊ฑด์œผ๋กœ๋งŒ ๋น„๊ต๋˜๋ฏ€๋กœ ๋งค์šฐ ๋น ๋ฅธ ๋ ˆ์ฝ”๋“œ ์กฐํšŒ ๋ฐฉ๋ฒ•์ค‘ ํ•˜๋‚˜.

mysql> explain
    -> select * from dept_emp where dept_no='d005';
+----+-------------+----------+------------+------+---------------+---------+---------+-------+--------+----------+-------+
| id | select_type | table    | partitions | type | possible_keys | key     | key_len | ref   | rows   | filtered | Extra |
+----+-------------+----------+------------+------+---------------+---------+---------+-------+--------+----------+-------+
|  1 | SIMPLE      | dept_emp | NULL       | ref  | PRIMARY       | PRIMARY | 16      | const | 165571 |   100.00 | NULL  |
+----+-------------+----------+------------+------+---------------+---------+---------+-------+--------+----------+-------+

dept_emp ํ…Œ์ด๋ธ”์˜ pk๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์นผ๋Ÿผ (dept_no, emp_no) ์ค‘ ์ผ๋ถ€ detp_no๋งŒ ๋™๋“ฑ ์กฐ๊ฑด์œผ๋กœ ์‚ฌ์šฉ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์กฐ๊ฑด์— ์ผ์น˜ํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๊ฐ€ 1๊ฑด์ด๋ผ๋Š” ๋ณด์žฅ์ด ์—†๋‹ค.

๊ทธ๋ž˜์„œ const๊ฐ€ ์•„๋‹Œ ref๊ฐ€ ์‚ฌ์šฉ๋˜์—ˆ๋‹ค.

  • const: ์กฐ์ธ์˜ ์ˆœ์„œ์™€ ๊ด€๊ณ„์—†์ด ํ”„๋ผ์ด๋จธ๋ฆฌ ํ‚ค๋‚˜ ์œ ๋‹ˆํฌ ํ‚ค์˜ ๋ชจ๋“  ์นผ๋Ÿผ์— ๋Œ€ํ•ด ๋™๋“ฑ ์กฐ๊ฑด์œผ๋กœ ๊ฒ€์ƒ‰(๋ฐ˜๋“œ์‹œ 1๊ฑด ๋ ˆ์ฝ”๋“œ ๋ฐ˜ํ™˜)
  • eq_ref: ์กฐ์ธ์—์„œ ์ฒซ ๋ฒˆ์งธ ์ฝ์€ ํ…Œ์ด๋ธ”์˜ ์นผ๋Ÿผ๊ฐ’์„ ์ด์šฉํ•ด ๋‘ ๋ฒˆ์งธ ํ…Œ์ด๋ธ”์„ pk๋‚˜ ์œ ๋‹ˆํฌ ํ‚ค๋กœ ๋™๋“ฑ ์กฐ๊ฑด ๊ฒ€์ƒ‰(๋‘ ๋ฒˆ์งธ ํ…Œ์ด๋ธ”์€ ๋ฐ˜๋“œ์‹œ 1๊ฑด ๋ ˆ์ฝ”๋“œ ๋ฐ˜ํ™˜)
  • ref: ์กฐ์ธ ์ˆœ์„œ๋‚˜ ์ธ๋ฑ์Šค ์ข…๋ฅ˜์— ๊ด€๊ณ„์—†์ด ๋™๋“ฑ ์กฐ๊ฑด์œผ๋กœ ๊ฒ€์ƒ‰

์œ„ ์„ธ๊ฐ€์ง€ ๋ชจ๋‘ ๋งค์šฐ ์ข‹์€ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์œผ๋กœ ์ธ๋ฑ์Šค์˜ ๋ถ„ํฌ๋„๊ฐ€ ๋‚˜์˜์ง€ ์•Š๋‹ค๋ฉด ์„ฑ๋Šฅ์ƒ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•๋“ค์ด๋‹ค.
์ฟผ๋ฆฌ๋ฅผ ํŠœ๋‹ํ•  ๋•Œ๋„ ์ด ์„ธ ๊ฐ€์ง€ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ๋Š” ํฌ๊ฒŒ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๊ณ  ๋„˜์–ด๊ฐ€๋„ ๋ฌด๋ฐฉ

fulltext

fulltext ์ ‘๊ทผ ๋ฐฉ๋ฒ•์€ MySQL ์„œ๋ฒ„์˜ ์ „๋ฌธ ๊ฒ€์ƒ‰ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•ด ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ์ ‘๊ทผ ๋ฐฉ๋ฒ•์„ ์˜๋ฏธํ•œ๋‹ค.
MySQL ์„œ๋ฒ„์—์„œ ์ „๋ฌธ ๊ฒ€์ƒ‰ ์กฐ๊ฑด์€ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ์ƒ๋‹นํžˆ ๋†’๋‹ค. ์ฟผ๋ฆฌ์—์„œ ์ „๋ฌธ ๊ฒ€์ƒ‰ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์กฐ๊ฑด๊ณผ ๊ทธ ์ด์™ธ์˜ ์ผ๋ฐ˜ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์กฐ๊ฑด์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์ผ๋ฐ˜ ์ธ๋ฑ์Šค์˜ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์ด const๋‚˜ eq_ref, ref๊ฐ€ ์•„๋‹ˆ๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ MySQL์€ ์ „๋ฌธ ๊ฒ€์ƒ‰ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์กฐ๊ฑด์„ ์„ ํƒํ•ด์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค.

์ „๋ฌธ ๊ฒ€์ƒ‰์€ MATCH, AGAINST ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•ด์„œ ์‹คํ–‰ํ•˜๋Š”๋ฐ, ์ด๋•Œ ๋ฐ˜๋“œ์‹œ ํ•ด๋‹น ํ…Œ์ด๋ธ”์— ์ „๋ฌธ ๊ฒ€์ƒ‰์šฉ ์ธ๋ฑ์Šค๊ฐ€ ์ค€๋น„๋ผ ์žˆ์–ด์•ผ๋งŒ ํ•œ๋‹ค.
ํ…Œ์ด๋ธ”์— ์ „๋ฌธ ์ธ๋ฑ์Šค๊ฐ€ ์—†๋‹ค๋ฉด ์ฟผ๋ฆฌ๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์ค‘์ง€๋  ๊ฒƒ์ด๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์ฟผ๋ฆฌ์— ์ „๋ฌธ ๊ฒ€์ƒ‰ ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•˜๋ฉด MySQL์€ ์ฃผ์ € ์—†์ด fulltext ์ ‘๊ทผ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค.
ํ•˜์ง€๋งŒ ์ „๋ฌธ ๊ฒ€์ƒ‰ ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•˜๋Š” fulltext๋ณด๋‹ค ์ผ๋ฐ˜ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” range ์ ‘๊ทผ ๋ฐฉ๋ฒ•์ด ๋” ๋นจ๋ฆฌ ์ฒ˜๋ฆฌ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์œผ๋ฏ€๋กœ ์ „๋ฌธ ๊ฒ€์ƒ‰ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์กฐ๊ฑด๋ณ„๋กœ ์„ฑ๋Šฅ์„ ํ™•์ธํ•ด ๋ณด๋Š” ํŽธ์ด ์ข‹๋‹ค.

ref_or_null

์ด ์ ‘๊ทผ ๋ฐฉ๋ฒ•์€ ref ์ ‘๊ทผ ๋ฐฉ๋ฒ•๊ณผ ๊ฐ™์€๋ฐ, null ๋น„๊ต๊ฐ€ ์ถ”๊ฐ€๋œ ํ˜•ํƒœ
์‹ค์ œ ์—…๋ฌด์—์„œ ๋งŽ์ด ํ™œ์šฉ๋˜์ง€๋Š” ์•Š์ง€๋งŒ, ๋งŒ์•ฝ ์‚ฌ์šฉ๋œ๋‹ค๋ฉด ๋‚˜์˜์ง€ ์•Š์€ ์ ‘๊ทผ ๋ฐฉ๋ฒ• ์ •๋„๋กœ ๊ธฐ์–ตํ•˜์ž

unique_subquery

where ์กฐ๊ฑด์ ˆ์—์„œ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” IN ํ˜•ํƒœ์˜ ์ฟผ๋ฆฌ๋ฅผ ์œ„ํ•œ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์ด๋‹ค. ์ด๋ฆ„ ์˜๋ฏธ ๊ทธ๋Œ€๋กœ ์„œ๋ธŒ์ฟผ๋ฆฌ์—์„œ ์ค‘๋ณต๋˜์ง€ ์•Š๋Š” ์œ ๋‹ˆํฌํ•œ ๊ฐ’๋งŒ ๋ฐ˜ํ™˜ํ•  ๋•Œ ์ด ์ ‘๊ทผ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค.

index_subquery

IN ์—ฐ์‚ฐ์ž์˜ ํŠน์„ฑ์ƒ IN(subquery), IN(์ƒ์ˆ˜๋“ค) ํ˜•ํƒœ์˜ ์กฐ๊ฑด์€ ๊ด„ํ˜ธ ์•ˆ์— ์žˆ๋Š” ๊ฐ’์˜ ๋ชฉ๋ก์—์„œ ์ค‘๋ณต๋œ ๊ฐ’์ด ๋จผ์ € ์ œ๊ฑฐ๋ผ์•ผ ํ•œ๋‹ค. ์•ž์˜ unique_subquery ์ ‘๊ทผ ๋ฐฉ๋ฒ•์€ IN(subquery) ์กฐ๊ฑด์˜ subquery ๊ฒฐ๊ณผ๊ฐ€ ์ค‘๋ณต๋œ ๊ฐ’์„ ๋งŒ๋“ค์–ด๋‚ด์ง€ ์•Š๋Š”๋‹ค๋Š” ๋ณด์žฅ์ด ์žˆ์œผ๋ฏ€๋กœ ๋ณ„๋„์˜ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•  ํ•„์š”๊ฐ€ ์—†์—ˆ๋‹ค.
ํ•˜์ง€๋งŒ IN(subquery)์—์„œ subquery๊ฐ€ ์ค‘๋ณต๋œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜๋„ ์žˆ๋Š”๋ฐ, ์ด ๋•Œ ์ค‘๋ณต๋œ ๊ฐ’์„ ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•ด์„œ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์„ ๋•Œ index_subquery ์ ‘๊ทผ ๋ฐฉ๋ฒ•์ด ์‚ฌ์šฉ๋œ๋‹ค.

์ฆ‰
unique_subquery ์ ‘๊ทผ ๋ฐฉ๋ฒ•์€ IN(subquery) ์กฐ๊ฑด์—์„œ ์„œ๋ธŒ์ฟผ๋ฆฌ์˜ ๋ฐ˜ํ™˜ ๊ฐ’์ด ์œ ๋‹ˆํฌ ๊ฐ’๋“ค์ด๋ฏ€๋กœ ๋ณ„๋„์˜ ์ค‘๋ณต ์ œ๊ฑฐ ์ž‘์—…์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋Š” ์˜๋ฏธ์ด๊ณ 
index_subqurey ์ ‘๊ทผ ๋ฐฉ๋ฒ•์€ IN(subquery) ์กฐ๊ฑด์—์„œ ์„œ๋ธŒ์ฟผ๋ฆฌ ๋ฐ˜ํ™˜ ๊ฐ’์ด ์ค‘๋ณต๋œ ๊ฐ’์ด ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•ด ์ค‘๋ณต ๊ฐ’์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

range

range๋Š” ๋ง๊ทธ๋Œ€๋กœ ์ธ๋ฑ์Šค ๋ ˆ์ธ์ง€ ์Šค์บ” ํ˜•ํƒœ์˜ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์ด๋‹ค.
range๋Š” ์ธ๋ฑ์Šค๋ฅผ ํ•˜๋‚˜์˜ ๊ฐ’์ด ์•„๋‹ˆ๋ผ ๋ฒ”์œ„๋กœ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์˜๋ฏธํ•˜๋Š”๋ฐ, ์ฃผ๋กœ "<, >, IS NULL, BETWEEN, IN, LIKE" ๋“ฑ์˜ ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•ด ์ธ๋ฑ์Šค๋ฅผ ๊ฒ€์ƒ‰ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๋ ˆ์ฝ”๋“œ๋ฅผ ํ•„์š”๋กœ ํ•˜๋Š๋ƒ์— ๋”ฐ๋ผ ์ฐจ์ด๋Š” ์žˆ๊ฒ ์ง€๋งŒ range ์ ‘๊ทผ ๋ฐฉ๋ฒ•๋„ ์ƒ๋‹นํžˆ ๋น ๋ฅด๋ฉฐ, ๋ชจ๋“  ์ฟผ๋ฆฌ๊ฐ€ ์ด ์ ‘๊ทผ ๋ฐฉ๋ฒ•๋งŒ ์‚ฌ์šฉํ•ด๋„ ์ตœ์ ์˜ ์„ฑ๋Šฅ์ด ๋ณด์žฅ๋œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

mysql> explain
    -> select * from employees where emp_no between 10002 and 10004;
+----+-------------+-----------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
| id | select_type | table     | partitions | type  | possible_keys | key     | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-----------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | employees | NULL       | range | PRIMARY       | PRIMARY | 4       | NULL |    3 |   100.00 | Using where |
+----+-------------+-----------+------------+-------+---------------+---------+---------+------+------+----------+-------------+

๋ณดํ†ต ์ธ๋ฑ์Šค ๋ ˆ์ธ์ง€ ์Šค์บ”์ด๋ผ๊ณ  ํ•˜๋ฉด const, ref, range ์„ธ ๊ฐ€์ง€ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์„ ๋ชจ๋‘ ๋ฌถ์–ด์„œ ์ง€์นญํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ดํ•ดํ•˜๊ณ 
์—…๋ฌด์ƒ ๊ฐœ๋ฐœ์ž๋‚˜ DBA์™€ ์†Œํ†ตํ•  ๋•Œ๋„ const, ref, range ์ ‘๊ทผ ๋ฐฉ๋ฒ•์„ ๊ตฌ๋ถ„ํ•ด์„œ ์–ธ๊ธ‰ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๊ฑฐ์˜ ์—†์—ˆ๋‹ค๊ณ  ํ•œ๋‹ค.
์ผ๋ฐ˜์ ์œผ๋กœ ์ธ๋ฑ์Šค ๋ ˆ์ธ์ง€ ์Šค์บ”, ๋ ˆ์ธ์ง€ ์Šค์บ”์œผ๋กœ ์–ธ๊ธ‰ํ•  ๋•Œ๊ฐ€ ๋งŽ์Œ
"์ธ๋ฑ์Šค๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค"๋ผ๋Š” ํ‘œํ˜„์€ ์ด ์„ธ๊ฐ€์ง€ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

index_merge

index_merge ์ ‘๊ทผ ๋ฐฉ๋ฒ•์€ 2๊ฐœ ์ด์ƒ์˜ ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•ด ๊ฐ๊ฐ์˜ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค์–ด๋‚ธ ํ›„, ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ณ‘ํ•ฉํ•ด์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
๊ทธ๋‹ค์ง€ ํšจ์œจ์ ์ด์ง€ ์•Š๋‹ค.

  • ์—ฌ๋Ÿฌ ์ธ๋ฑ์Šค๋ฅผ ์ฝ์–ด์•ผ ํ•˜๋ฏ€๋กœ ์ผ๋ฐ˜์ ์œผ๋กœ range ์ ‘๊ทผ ๋ฐฉ๋ฒ•๋ณด๋‹ค ํšจ์œจ์„ฑ์ด ๋–จ์–ด์ง
  • ์ „๋ฌธ ๊ฒ€์ƒ‰ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฟผ๋ฆฌ์—์„œ๋Š” index_merge๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š์Œ
  • index_merge ์ ‘๊ทผ ๋ฐฉ๋ฒ•์œผ๋กœ ์ฒ˜๋ฆฌ๋œ ๊ฒฐ๊ณผ๋Š” ํ•ญ์ƒ 2๊ฐœ ์ด์ƒ์˜ ์ง‘ํ•ฉ์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ๋‘ ์ง‘ํ•ฉ์˜ ๊ต์ง‘ํ•ฉ์ด๋‚˜ ํ•ฉ์ง‘ํ•ฉ, ๋˜๋Š” ์ค‘๋ณต ์ œ๊ฑฐ์™€ ๊ฐ™์€ ๋ถ€๊ฐ€์ ์ธ ์ž‘์—…์ด ์ถ”๊ฐ€๋กœ ์š”๊ตฌ๋œ๋‹ค
mysql> explain
    -> select * from employees
    -> where emp_no between 10001 and 11000 or first_name='Smith';
+----+-------------+-----------+-------------+----------------------+----------------------+------------------------------------------------+
| id | select_type | table     | type        | possible_keys        | key                  | Extra                                          |
+----+-------------+-----------+-------------+----------------------+----------------------+------------------------------------------------+
|  1 | SIMPLE      | employees | index_merge | PRIMARY,ix_firstname | PRIMARY,ix_firstname | Using union(PRIMARY,ix_firstname); Using where |
+----+-------------+-----------+-------------+----------------------+----------------------+------------------------------------------------+
1 row in set, 1 warning (0.00 sec)

์œ„ ์ฟผ๋ฆฌ์—์„œ or๋กœ ์—ฐ๊ฒฐ๋œ ๋‘ ๊ฐœ ์กฐ๊ฑด์ด ๋ชจ๋‘ ๊ฐ๊ฐ ๋‹ค๋ฅธ ์ธ๋ฑ์Šค๋ฅผ ์ตœ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์กฐ๊ฑด์ด๋‹ค.
๋”ฐ๋ผ์„œ ์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” between ์กฐ๊ฑด์€ employees ํ…Œ์ด๋ธ”์˜ pk๋ฅผ ์ด์šฉํ•ด ์กฐํšŒํ•˜๊ณ , name ์กฐ๊ฑด์€ ix_firstname ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•ด ์กฐํšŒํ•œ ํ›„ ๋‘ ๊ฒฐ๊ณผ๋ฅผ ๋ณ‘ํ•ฉํ•˜๋Š” ํ˜•ํƒœ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ์‹คํ–‰ ๊ฒŒํš์„ ๋งŒ๋“ค์–ด๋‚ธ๋‹ค.

index

index ์ ‘๊ทผ ๋ฐฉ๋ฒ•์€ ์ธ๋ฑ์Šค๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์ฝ๋Š” ์ธ๋ฑ์Šค ํ’€ ์Šค์บ”์„ ์˜๋ฏธํ•œ๋‹ค.
์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•˜๊ธฐ๋Š” ํ•˜์ง€๋งŒ range ์ฒ˜๋Ÿผ ์ธ๋ฑ์Šค์˜ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ์ฝ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ํšจ์œจ์ ์œผ๋กœ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๋ณด๊ธฐ๋Š” ์–ด๋ ต๋‹ค.

๋‹ค๋งŒ ํ’€ ํ…Œ์ด๋ธ” ์Šค์บ” ๋ฐฉ์‹๊ณผ ๋น„๊ตํ–ˆ์„ ๋•Œ ๋น„๊ตํ•˜๋Š” ๋ ˆ์ฝ”๋“œ ๊ฑด์ˆ˜๋Š” ๊ฐ™์•„๋„ ์ธ๋ฑ์Šค๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐ์ดํ„ฐ ์ „์ฒด ํŒŒ์ผ๋ณด๋‹ค ํฌ๊ธฐ๊ฐ€ ์ž‘์œผ๋ฏ€๋กœ ๋” ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ๋˜๋ฉฐ
์ฟผ๋ฆฌ์˜ ๋‚ด์šฉ์— ๋”ฐ๋ผ ์ •๋ ฌ๋œ ์ธ๋ฑ์Šค์˜ ์žฅ์ ์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ ํ›จ์”ฌ ํšจ์œจ์ ์ด๋ผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹ค์Œ ์„ธ๊ฐ€์ง€ ์กฐ๊ฑด ๊ฐ€์šด๋ฐ (1, 2) ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜๊ฑฐ๋‚˜ (1, 3) ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜๋Š” ์ฟผ๋ฆฌ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ฝ๊ธฐ ๋ฐฉ์‹์ด๋‹ค.

  • range๋‚˜ const, ref ๊ฐ™์€ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์œผ๋กœ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ
  • ์ธ๋ฑ์Šค์— ํฌํ•จ๋œ ์นผ๋Ÿผ๋งŒ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ฟผ๋ฆฌ์ธ ๊ฒฝ์šฐ
  • ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•ด ์ •๋ ฌ์ด๋‚˜ ๊ทธ๋ฃจํ•‘ ์ž‘์—…์ด ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ(๋ณ„๋„์˜ ์ •๋ ฌ ์ž‘์—…์„ ํ”ผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ)
mysql> explain
    -> select * from departments order by dept_name desc limit 10;
+----+-------------+-------------+------------+------+---------------+------+---------+------+------+----------+----------------+
| id | select_type | table       | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra          |
+----+-------------+-------------+------------+------+---------------+------+---------+------+------+----------+----------------+
|  1 | SIMPLE      | departments | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    9 |   100.00 | Using filesort |
+----+-------------+-------------+------------+------+---------------+------+---------+------+------+----------+----------------+
1 row in set, 1 warning (0.00 sec)

์œ„ ์‹คํ–‰ ๊ณ„ํš์€ ํ…Œ์ด๋ธ”์˜ ์ธ๋ฑ์Šค๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์ฝ๋Š” index ์ ‘๊ทผ ๋ฐฉ๋ฒ•์ด์ง€๋งŒ limit ์กฐ๊ฑด์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๋‹นํžˆ ํšจ์œจ์ ์ด๋‹ค. ๋‹จ์ˆœํžˆ ์ธ๋ฑ์Šค๋ฅผ ์—ญ์ˆœ์œผ๋กœ ์ฝ์–ด 10๊ฐœ๋งŒ ๊ฐ€์ ธ์˜ค๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
ํ•˜์ง€๋งŒ limit ์กฐ๊ฑด์ด ์—†๊ฑฐ๋‚˜ ๊ฐ€์ ธ์™€์•ผ ํ•  ๋ ˆ์ฝ”๋“œ ๊ฑด์ˆ˜๊ฐ€ ๋งŽ์•„์ง€๋ฉด ์ƒ๋‹นํžˆ ๋Š๋ฆฐ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

all

all์€ ํ’€ ํ…Œ์ด๋ธ” ์Šค์บ”์„ ์˜๋ฏธํ•˜๋Š” ์ ‘๊ทผ ๋ฐฉ๋ฒ•์ด๋‹ค. ํ…Œ์ด๋ธ”์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์ „๋ถ€ ์ฝ์–ด์„œ ๋ถˆํ•„์š”ํ•œ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐ(์ฒดํฌ ์กฐ๊ฑด์ด ์กด์žฌํ•œ๋‹ค๋ฉด)ํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•œ๋‹ค.
ํ’€ ํ…Œ์ด๋ธ” ์Šค์บ”์€ ์ง€๊ธˆ๊นŒ์ง€ ์„ค๋ช…ํ•œ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†์„ ๋•Œ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ์„ ํƒํ•˜๋Š” ๊ฐ€์žฅ ๋น„ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์ด๋‹ค.

๋‹ค๋ฅธ DBMS์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ InnoDB๋„ ํ’€ ํ…Œ์ด๋ธ” ์Šค์บ”์ด๋‚˜ ์ธ๋ฑ์Šค ํ’€ ์Šค์บ”๊ณผ ๊ฐ™์€ ๋Œ€๋Ÿ‰์˜ ๋””์Šคํฌ I/O๋ฅผ ์œ ๋ฐœํ•˜๋Š” ์ž‘์—…์„ ์œ„ํ•ด ํ•œ๊บผ๋ฒˆ์— ๋งŽ์€ ํŽ˜์ด์ง€๋ฅผ ์ฝ์–ด ๋“ค์ด๋Š” ๋ฆฌ๋“œ ์–ดํ—ค๋“œ(Read Ahead)๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ๋ฐ์ดํ„ฐ ์›จ์–ดํ•˜์šฐ์Šค๋‚˜ ๋ฐฐ์น˜ ํ”„๋กœ๊ทธ๋žจ์ฒ˜๋Ÿผ ๋Œ€์šฉ๋Ÿ‰์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฟผ๋ฆฌ์—์„œ๋Š” ์ž˜๋ชป ํŠœ๋‹๋œ ์ฟผ๋ฆฌ(์–ต์ง€๋กœ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ํŠœ๋‹๋œ ์ฟผ๋ฆฌ)๋ณด๋‹ค ๋” ๋‚˜์€ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์ด๊ธฐ๋Š” ํ•˜๋‹ค.

์ฟผ๋ฆฌ๋ฅผ ํŠœ๋‹ํ•˜๋Š” ๊ฒƒ์ด ๋ฌด์กฐ๊ฑด ์ธ๋ฑ์Šค ํ’€ ์Šค์บ”์ด๋‚˜ ํ…Œ์ด๋ธ” ํ’€ ์Šค์บ”์„ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ผ๋Š” ์ ์„ ๊ธฐ์–ตํ•ด์•ผํ•œ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ index์™€ all ์ ‘๊ทผ ๋ฐฉ๋ฒ•์€ ์ž‘์—… ๋ฒ”์œ„๋ฅผ ์ œํ•œํ•˜๋Š” ์กฐ๊ฑด์ด ์•„๋‹ˆ๋ฏ€๋กœ ๋น ๋ฅธ ์‘๋‹ต์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด๋‚ด์•ผ ํ•˜๋Š” ์›น ์„œ๋น„์Šค ๋“ฑ๊ณผ ๊ฐ™์€ ์˜จ๋ผ์ธ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ ํ™˜๊ฒฝ์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค. ํ…Œ์ด๋ธ”์ด ๋งค์šฐ ์ž‘์ง€ ์•Š๋‹ค๋ฉด ์‹ค์ œ๋กœ ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋Š ์ •๋„ ์ €์žฅํ•œ ์ƒํƒœ์—์„œ ์ฟผ๋ฆฌ์˜ ์„ฑ๋Šฅ์„ ํ™•์ธํ•ด๋ณด๊ณ  ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

Reference

์œ„ ๊ธ€์€ ์ฑ… RealMySQL 8.0์„ ๊ตฌ์ž…ํ•˜์—ฌ ์ฝ๊ณ  ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.