뷰의 실행 계획을 어떻게 얻습니까?


9

여러보기가있는 스키마가 있습니다. 적절한 인덱스가 있고 사용 중인지 확인하기 위해 실행 계획을 확인해야합니다.

어떻게해야합니까?

차라리의 출력 복사 및 붙여 넣기 할 필요가 없습니다 것 show create view <viewname>로를 explain보기 중 일부는 다른 뷰 위에 구축이 매우 통증이있을 것이다 특히.


1
VIEW가 실제 쿼리에서 사용될 때 실행 계획은 VIEW에서 선택하는 쿼리의 WHERE 및 기타 절에 따라 다르므로주의하십시오. MySQL은 VIEW를 최적화하는 데 상당히 나쁘지만, 예를 들어 조건을 낮추는 최적화가 있습니다.
Jannes

@Jannes 좋은 지적, 나는 그 측면을 고려하지 않았습니다. 실행 계획 select * from <view_name>이 일치 한다고 가정하는 것이 안전 합니까?
매트 펜윅

1
그래 내가 아는 한 mysql이 field1 = 10 인 select * from <view-name>에서 field1 의 인덱스를 사용 하려면 뷰를 정말 단순하게 유지해야합니다. 예를 들어 GROUP BY 또는 UNION이 없습니다. 당신이보고있는 실행 계획이 mysql이 사용할 최적화를 찾으면 더 나아질 수 있다는 최악의 상황이라고 말할 수 있습니다.
Jannes

답변:


7

이것이 내가 처음 시도한 것입니다.

mysql> explain view_name;
+---------+------------+------+-----+---------+-------+
| Field   | Type       | Null | Key | Default | Extra |
+---------+------------+------+-----+---------+-------+
| field1  | varchar(3) | YES  |     | NULL    |       |
| field2  | varchar(3) | YES  |     | NULL    |       |
| field3  | bigint(21) | NO   |     | 0       |       |
| field4  | bigint(21) | NO   |     | 0       |       |
+---------+------------+------+-----+---------+-------+

분명히 이것은 작동하지 않습니다-그것은하는 것과 같습니다 describe view_name.

그러나 select * from view_name작동하는 것 같습니다.

mysql> explain select * from view_name;
+----+-------------+------------+------+---------------+------+---------+------+------+---------------------------------+
| id | select_type | table      | type | possible_keys | key  | key_len | ref  | rows | Extra                           |
+----+-------------+------------+------+---------------+------+---------+------+------+---------------------------------+
|  1 | PRIMARY     | <derived5> | ALL  | NULL          | NULL | NULL    | NULL |   18 |                                 |
|  1 | PRIMARY     | <derived3> | ALL  | NULL          | NULL | NULL    | NULL |  105 | Using where; Using join buffer  |
|  5 | DERIVED     | <derived6> | ALL  | NULL          | NULL | NULL    | NULL |   68 | Using temporary; Using filesort |
|  6 | DERIVED     | basetable  | ALL  | NULL          | NULL | NULL    | NULL |  928 | Using temporary; Using filesort |
|  3 | DERIVED     | <derived4> | ALL  | NULL          | NULL | NULL    | NULL |  386 | Using temporary; Using filesort |
|  4 | DERIVED     | basetable  | ALL  | NULL          | NULL | NULL    | NULL |  928 | Using temporary; Using filesort |
+----+-------------+------------+------+---------------+------+---------+------+------+---------------------------------+

명확하고 간단한 답변은 +1입니다. 나는 당신에 따라 대답을 조정했습니다. 이것에 대한 답변을 받아 들여야합니다.
RolandoMySQLDBA

7

information_schema.views 테이블을 사용하십시오.

모든 뷰에 대해 EXPLAIN이 생성됩니다.

mysql -uroot -p -AN -e"select concat('explain ',view_definition) from information_schema.views" > /root/ExplainViews.sql

mydb 데이터베이스의 모든 뷰에 대한 EXPLAIN이 생성됩니다.

mysql -uroot -p -AN -e"select concat('explain ',view_definition) from information_schema.views where table_schema = 'mydb'" > /root/ExplainViews.sql

시도 해봐 !!!

업데이트 2012-03-22 11:30 EDT

@ MattFenwick, 당신의 대답은 내 것보다 훨씬 간단합니다. 다음은 MySQL 5.5.12를 실행하는 PC에서 시도한 예입니다. 귀하의 답변에서 SELECT 버전과 내 답변에서 생성 된 EXPLAIN 모두에서 EXPLAIN을 실행했습니다.

mysql> explain select * from bigjoin;
+----+-------------+-------+--------+---------------+---------+---------+---------------+------+-------------+
| id | select_type | table | type   | possible_keys | key     | key_len | ref           | rows | Extra       |
+----+-------------+-------+--------+---------------+---------+---------+---------------+------+-------------+
|  1 | SIMPLE      | k     | index  | NULL          | PRIMARY | 4       | NULL          |   14 | Using index |
|  1 | SIMPLE      | a     | eq_ref | PRIMARY       | PRIMARY | 4       | test.k.id_key |    1 | Using index |
|  1 | SIMPLE      | b     | ALL    | NULL          | NULL    | NULL    | NULL          |    4 |             |
+----+-------------+-------+--------+---------------+---------+---------+---------------+------+-------------+
3 rows in set (0.00 sec)

mysql> explain select `a`.`id_key` AS `id_key1`,`b`.`id_key` AS `id_key2` from ((`test`.`idlist` `k` left join `test`.`id_key_table` `a` on((`k`.`id_key` = `a`.`id_key`))) left join `test`.`new_keys_to_load` `b` on((`k`.`id_key` = `b`.`id_key`)));
+----+-------------+-------+--------+---------------+---------+---------+---------------+------+-------------+
| id | select_type | table | type   | possible_keys | key     | key_len | ref           | rows | Extra       |
+----+-------------+-------+--------+---------------+---------+---------+---------------+------+-------------+
|  1 | SIMPLE      | k     | index  | NULL          | PRIMARY | 4       | NULL          |   14 | Using index |
|  1 | SIMPLE      | a     | eq_ref | PRIMARY       | PRIMARY | 4       | test.k.id_key |    1 | Using index |
|  1 | SIMPLE      | b     | ALL    | NULL          | NULL    | NULL    | NULL          |    4 |             |
+----+-------------+-------+--------+---------------+---------+---------+---------------+------+-------------+
3 rows in set (0.00 sec)

mysql>

그들은 같은 EXPLAIN 계획을 만들었습니다. 나는 당신의 길을 이행하기 위해 대답을 바꿀 것입니다. 단순함을 위해 +2이지만 나에게서 +1을받습니다. 계속해서 이것에 대한 자신의 대답을 받아 들여야합니다.

다음은 MySQL의 VIEW에 대한 흥미로운 사실입니다. 뷰는 information_schema 데이터베이스의 두 위치에 표시됩니다

모든 뷰에 대해 EXPLAIN이 생성됩니다.

mysql -uroot -p -AN -e"select concat('explain select * from ',table_schema,'.',table_name,';') from information_schema.tables WHERE engine IS NULL" > /root/ExplainViews.sql

또는

mysql -uroot -p -AN -e"select concat('explain select * from ',table_schema,'.',table_name,';') from information_schema.views" > /root/ExplainViews.sql

mydb 데이터베이스의 모든 뷰에 대한 EXPLAIN이 생성됩니다.

mysql -uroot -p -AN -e"select concat('explain select * from ',table_schema,'.',table_name,';') from information_schema.tables WHERE table_schema='mydb' AND engine IS NULL;" > /root/ExplainViews.sql

또는

mysql -uroot -p -AN -e"select concat('explain select * from ',table_schema,'.',table_name,';') from information_schema.views WHERE table_schema='mydb';" > /root/ExplainViews.sql

실행 계획이 동일한 방식임을 보여주는 +1!
매트 펜윅
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.