Làm thế nào để tôi có được kế hoạch thực hiện cho một khung nhìn?


9

Tôi có một lược đồ với một số lượt xem. Tôi cần kiểm tra các kế hoạch thực hiện để đảm bảo các chỉ mục thích hợp được đặt đúng chỗ và đang được sử dụng.

Làm thế nào để tôi làm điều này?

Tôi không muốn phải sao chép và dán đầu ra từ show create view <viewname>vào explain, đặc biệt là khi một số chế độ xem được xây dựng trên các chế độ xem khác và điều này sẽ khá khó khăn.


1
Lưu ý rằng kế hoạch thực hiện có thể khác nhau khi VIEW được sử dụng trong các truy vấn thực tế, vì nó phụ thuộc vào WHERE và các mệnh đề khác trong truy vấn chọn từ VIEW. Mặc dù MySQL khá tệ trong việc tối ưu hóa VIEW, nhưng nó có một số tối ưu hóa trong đó các điều kiện được đẩy xuống chẳng hạn.
Jannes

@Jannes điểm tốt, tôi đã không xem xét khía cạnh đó. Có an toàn để giả định rằng kế hoạch thực hiện từ select * from <view_name>sẽ phù hợp?
Matt Fenwick

1
Vâng theo như tôi biết. Nếu bạn muốn mysql sử dụng một chỉ mục trên trường1 trong chọn * từ <view-name> trong đó field1 = 10 thì bạn phải giữ chế độ xem thực sự đơn giản. Không có NHÓM THEO hoặc UNION chẳng hạn. Tôi đoán bạn có thể nói rằng kế hoạch thực hiện mà bạn đang xem là một tình huống tồi tệ nhất ở chỗ nó chỉ có thể trở nên tốt hơn nếu mysql tìm thấy một tối ưu hóa để sử dụng.
Jannes

Câu trả lời:


7

Đây là những gì tôi đã thử đầu tiên:

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       |       |
+---------+------------+------+-----+---------+-------+

Rõ ràng điều này không hoạt động - nó giống như làm describe view_name.

Tuy nhiên, select * from view_namedường như hoạt động:

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 cho câu trả lời rõ ràng, đơn giản hơn. Tôi điều chỉnh câu trả lời của tôi dựa trên bạn. Bạn nên chấp nhận câu trả lời của bạn về điều này.
RolandoMySQLDBA

7

Sử dụng bảng information_schema.view

Điều này sẽ tạo ra GIẢI THÍCH cho tất cả các lượt xem

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

Điều này sẽ tạo ra GIẢI THÍCH cho tất cả các chế độ xem trong cơ sở dữ liệu mydb

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

Hãy thử một lần !!!

CẬP NHẬT 2012 / 03-22 11:30 EDT

@MattFenwick, câu trả lời của bạn đơn giản hơn tôi rất nhiều. Đây là một ví dụ tôi đã thử trên PC chạy MySQL 5.5.12. Tôi đã chạy EXPLAIN trên cả phiên bản CHỌN từ câu trả lời của bạn và EXPLAIN được tạo từ câu trả lời của tôi:

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>

Cả hai đều sản xuất cùng một kế hoạch GIẢI THÍCH. Tôi sẽ thay đổi câu trả lời của tôi để thực hiện theo cách của bạn. Bạn nhận được +1 từ tôi mặc dù nó đơn giản là +2. Bạn nên đi trước và chấp nhận câu trả lời của riêng bạn về điều này.

Đây là một thông tin thú vị về VIEWs trong MySQL: Một khung nhìn được thể hiện ở hai nơi trong cơ sở dữ liệu information_schema

Điều này sẽ tạo ra GIẢI THÍCH cho tất cả các lượt xem

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

hoặc là

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

Điều này sẽ tạo ra GIẢI THÍCH cho tất cả các chế độ xem trong cơ sở dữ liệu 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

hoặc là

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 để chỉ ra rằng kế hoạch thực hiện là giống nhau cả hai cách!
Matt Fenwick
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.