Як отримати план виконання для перегляду?


9

У мене є схема з низкою переглядів. Мені потрібно перевірити плани виконання, щоб переконатися, що відповідні індекси встановлені та використовуються.

Як це зробити?

Я волів би не потрібно копіювати і вставляти його з show create view <viewname>INTO explain, особливо деякі думки побудовані на вершині інших поглядів , і це буде досить біль.


1
Зауважте, що план виконання може бути різним, коли VIEW використовується у запитах реального життя, оскільки це залежить від WHERE та інших пунктів запиту, що вибираються з VIEW. Незважаючи на те, що MySQL досить погано оптимізує VIEW, він має деякі оптимізації, наприклад, наприклад, коли умови знижуються.
Яннес

@Jannes Добре, я не вважав цей аспект. Чи можна припустити, що план виконання select * from <view_name>буде відповідати?
Метт Фенвік

1
Так, наскільки я знаю. Якщо ви хочете, щоб mysql використовував індекс на field1 у виборі * від <view-name>, де field1 = 10, ви повинні зберегти подання дуже просто. Ні, наприклад, ГРУПИ або СПІЛКИ. Я думаю, ви могли б сказати, що ви шукаєте план виконання, який виглядає як найгірший випадок, коли він може покращитися, лише якщо mysql знайде оптимізацію для використання.
Яннес

Відповіді:


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

Це створить ПОЯСНЕННЯ для всіх переглядів

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

Це створить ПОЯСНЕННЯ для всіх переглядів у базі даних mydb

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. Я запустив ПОЯСНЕННЯ і на ВИБРАНУ версію з вашої відповіді, і на ПОЯСНЕННЯ, згенеровану з моєї відповіді:

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>

Вони обоє склали той самий план ПОЯСНЕННЯ. Я зміню свою відповідь, щоб реалізувати ваш шлях. Ви отримуєте +1 від мене, хоча це +2 для простоти. Вам слід піти вперед і прийняти власну відповідь на цю.

Ось цікавий фактоїд про VIEW у MySQL: Вид представлений у двох місцях у базі даних information_schema

Це створить ПОЯСНЕННЯ для всіх переглядів

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

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 за те, що показує, що план виконання однаковий і в іншому випадку!
Метт Фенвік
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.