Bir görünüm için yürütme planını nasıl alabilirim?


9

Birkaç görünümleri olan bir şema var. Uygun dizinlerin yerinde ve kullanıldığından emin olmak için yürütme planlarını kontrol etmem gerekiyor.

Bunu nasıl yaparım?

Daha doğrusu gelen çıktıyı kopyalayıp yapıştırmak olurdu değil show create view <viewname>INTO explainbazı görüşlerini diğer görünümlerde üzerine inşa edilmiştir ve bu oldukça acı olurdu, özellikle de.


1
GÖRÜNÜM, gerçek yaşam sorgularında kullanıldığında, NEREYE ve sorgudaki GÖRÜNÜM'den seçim yapan diğer maddelere bağlı olduğu için yürütme planının farklı olabileceğini unutmayın. MySQL, VIEW'ları optimize etmede oldukça kötü olmasına rağmen, örneğin koşulların aşağı çekildiği bazı optimizasyonlara sahiptir.
Jannes

@Jannes iyi bir nokta, bu yönü düşünmedim. Sitesinden yürütme planının select * from <view_name>eşleşeceğini varsaymak güvenli midir?
Matt Fenwick

1
Evet bildiğim kadarıyla. Mysql dosyasının <view-name> öğesinden select1 alanında field1 üzerinde bir dizin kullanmasını istiyorsanız , field1 = 10 değerini görüntülemeniz gerekir. Örneğin GROUP BY veya UNION yok. Baktığınız yürütme planının, en kötü durumun bir tür olduğunu söyleyebilirim, ancak mysql kullanmak için bir optimizasyon bulursa daha iyi olabilir.
Jannes

Yanıtlar:


7

İlk denediğim bu oldu:

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

Açıkçası bu işe yaramıyor - yapmakla aynı describe view_name.

Ancak, select * from view_nameişe yarıyor gibi görünüyor:

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

Açık ve basit bir cevap için +1. Cevabımı sizinkine göre ayarladım. Bu konuda cevabınızı kabul etmelisiniz.
RolandoMySQLDBA

7

Kullanım information_schema.views tablosunu

Bu, tüm görünümler için EXPLAIN alanını oluşturur

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

Bu mydb veritabanındaki tüm görünümler için EXPLAIN oluşturur

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

Bir şans ver !!!

GÜNCELLEME 2012-03-22 11:30 EDT

@MattFenwick, cevabınız benimkinden çok daha basit. İşte MySQL 5.5.12 çalıştıran bilgisayarımda denedim bir örnek. Hem cevabınızdan SELECT sürümü hem de cevabımdan oluşturulan EXPLAIN üzerinde EXPLAIN kullandım:

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>

Her ikisi de aynı EXPLAIN planını üretti. Yolunu uygulamak için cevabımı değiştireceğim. Basitlik için +2 olmasına rağmen benden +1 alırsınız. Devam etmeli ve bu konuda kendi cevabını kabul etmelisin.

İşte MySQL'deki VIEW'lar hakkında ilginç bir factoid: Bir görünüm, info_schema veritabanında iki yerde temsil edilir

Bu, tüm görünümler için EXPLAIN alanını oluşturur

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

veya

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

Bu mydb veritabanındaki tüm görünümler için EXPLAIN oluşturur

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

veya

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

Uygulama planının her iki şekilde de aynı olduğunu göstermek için +1!
Matt Fenwick
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.