ฉันจะรับแผนปฏิบัติการสำหรับมุมมองได้อย่างไร


9

ฉันมีสคีมาพร้อมจำนวนการดู ฉันต้องตรวจสอบแผนการดำเนินการเพื่อให้แน่ใจว่ามีการใช้ดัชนีที่เหมาะสมและถูกต้องหรือไม่

ฉันจะทำสิ่งนี้ได้อย่างไร

ฉันไม่ต้องการคัดลอกและวางผลลัพธ์จากshow create view <viewname>ลงในexplainโดยเฉพาะอย่างยิ่งเนื่องจากบางมุมมองถูกสร้างขึ้นจากมุมมองอื่นและนี่อาจเป็นความเจ็บปวด


1
โปรดทราบว่าแผนการดำเนินการอาจแตกต่างกันเมื่อใช้ VIEW ในแบบสอบถามแบบใช้งานจริงเนื่องจากขึ้นอยู่กับ WHERE และส่วนคำสั่งอื่น ๆ ในแบบสอบถามที่เลือกจาก VIEW แม้ว่า MySQL นั้นค่อนข้างแย่ในการปรับ VIEW ให้เหมาะสม แต่ก็มีการปรับให้เหมาะสมบางอย่างที่เงื่อนไขถูกลดตัวอย่างเช่น
Jannes

@ Janes จุดดีฉันไม่ได้พิจารณาด้านนั้น ปลอดภัยหรือไม่ที่จะสมมติว่าแผนการดำเนินการจากselect * from <view_name>นั้นจะตรงกัน
Matt Fenwick

1
ใช่เท่าที่ฉันรู้ ถ้าคุณต้องการให้ mysql ใช้ดัชนีบน field1 ในselect * จาก <view-name> โดยที่ field1 = 10คุณต้องทำให้มุมมองนั้นง่ายมาก ไม่มี 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ตาราง

สิ่งนี้จะสร้างคำอธิบายสำหรับทุกมุมมอง

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 ฉันรันคำอธิบายทั้งคำว่า SELECT และคำอธิบายของคุณจากคำตอบของฉัน:

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 เพื่อความเรียบง่าย คุณควรไปข้างหน้าและยอมรับคำตอบของคุณเองในเรื่องนี้

นี่เป็นข้อเท็จจริงที่น่าสนใจเกี่ยวกับมุมมองใน 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 สำหรับแสดงว่าแผนการดำเนินการเหมือนกันทั้งสองวิธี!
Matt Fenwick
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.