MySQL Sorgu Optimize Edici dizin istatistiklerini nereden okuyor?


14

Nerede bir sorgu maliyeti hazırlar (MySQL optimizer bir tablo için kullanılabilir indeksler listesini elde etmeye karar vermek çalışıyorum).


Geliştiriciler ve DBA'lar duraklatılmalı ve dizin istatistiklerinin nasıl derlendiğini ve saklandığını düşünmelidirler.
RolandoMySQLDBA

Referans olarak, mysql dokümantasyon web sitesinden: < dev.mysql.com/doc/refman/5.0/en/innodb-restrictions.html >> her birine sekiz rastgele dalış yaparak ANALYZE TABLEendeks kardinalitesini belirler ( SHOW INDEXçıktı Kardinalite sütununda gösterildiği gibi ) endeks ağaçlarının ve indeks kardinalite tahminlerinin buna göre güncellenmesi. Bunlar sadece tahmin olduğundan, ANALYZE TABLE'ın tekrarlanan çalışmaları farklı sayılar üretebilir. Bu ANALYZE TABLE, InnoDB tablolarında hızlıdır, ancak tüm satırları dikkate almadığı için% 100 doğru değildir.
Chen Xie

Yanıtlar:


6

Bunun doğrudan cevabı

information_schema.statistics

mysql> desc information_schema.statistics;
+---------------+---------------+------+-----+---------+-------+
| Field         | Type          | Null | Key | Default | Extra |
+---------------+---------------+------+-----+---------+-------+
| TABLE_CATALOG | varchar(512)  | NO   |     |         |       |
| TABLE_SCHEMA  | varchar(64)   | NO   |     |         |       |
| TABLE_NAME    | varchar(64)   | NO   |     |         |       |
| NON_UNIQUE    | bigint(1)     | NO   |     | 0       |       |
| INDEX_SCHEMA  | varchar(64)   | NO   |     |         |       |
| INDEX_NAME    | varchar(64)   | NO   |     |         |       |
| SEQ_IN_INDEX  | bigint(2)     | NO   |     | 0       |       |
| COLUMN_NAME   | varchar(64)   | NO   |     |         |       |
| COLLATION     | varchar(1)    | YES  |     | NULL    |       |
| CARDINALITY   | bigint(21)    | YES  |     | NULL    |       |
| SUB_PART      | bigint(3)     | YES  |     | NULL    |       |
| PACKED        | varchar(10)   | YES  |     | NULL    |       |
| NULLABLE      | varchar(3)    | NO   |     |         |       |
| INDEX_TYPE    | varchar(16)   | NO   |     |         |       |
| COMMENT       | varchar(16)   | YES  |     | NULL    |       |
| INDEX_COMMENT | varchar(1024) | NO   |     |         |       |
+---------------+---------------+------+-----+---------+-------+
16 rows in set (0.01 sec)

İle bu tablodan SEÇEBİLİRSİNİZ

SELECT * FROM information_schema.statistics
WHERE table_schema='mydb' AND table_name='mytable';

veya yaparak istatistikleri görün

Mydb.mytable'DAN ENDEKSLERİ GÖSTER;

Lütfen bu tablonun yazma ağır bir ortamda her zaman doğru olmadığını unutmayın. Periyodik olarak ANALİZ TABLOSU'nu çalıştırmanız gerekecektir. sık güncellenen tüm MyISAM tablolarına karşı . Aksi takdirde, information_schema.statistics'e dayanan MySQL Sorgu İyileştiricisi, sorgular için EXPLAIN planları geliştirirken bazen kötü seçimler yapabilir. Endeks istatistikleri mümkün olduğunca güncel olmalıdır.

ANALİZ TABLOSU InnoDB tablolarına KESİNLİKLE ETKİSİ YOKTUR. InnoDB için tüm endeks istatistikleri, BTREE sayfalarına yapılan dalışlar yoluyla talep üzerine hesaplanmaktadır. Bu nedenle, bir INnoDB tablo karşı INDEXES GÖSTER ENDONEX çalıştırdığınızda, görüntülenen kardinaliteler her zaman yaklaşık.

GÜNCELLEME 2011-06-21 12:17 EDT

ANALİZ TABLOSUNUN netleştirilmesi için tekrar yazayım. InnoDB tablolarında ANALYZE TABLOSU çalıştırmak tamamen işe yaramaz. Bir İNnoDB tablosunda ANALYZE TABLOSunu çalıştırsanız bile, InnoDB depolama motoru, kardinalite tahminleri için tekrar tekrar endekslere dalış yapar ve böylece derlediğiniz istatistikleri çöker . Aslında Percona, ANALİZ TABLOSU üzerinde bazı testler yaptı ve bu sonuca vardı.


5

Re: ANALİZ TABLOSU InnoDB tablolarına karşı KESİNLİKLE ETKİ YOKTUR.

Bu ifadenin doğru olup olmadığından emin değilim. Biz yoğun okuma ve yazma innodb tabloları ve mysql optimizer kötü seçim yaptığında, sorgu açıklamak çıktı kötü strateji gösterir. ve ayrıca bir Innodb tablosundan INDEXES GÖSTER, kardinalite değerlerinde çok fazla farklılık gösterir. Ancak bu innodb tablolarında bir ANALYZE komutu çalıştırmak açıklama planını düzeltir ve aynı zamanda kardinalitenin varyans davranışını ortadan kaldırır. Innodb tablolarında ANALYZE tablo komutunun her zaman yardımcı olup olmadığını bilmiyorum ama bizim durumumuzda, zamanın yaklaşık% 99'una yardımcı oldu.

Sorgularımıza "STRAIGHT_JOIN" ifadesini ekleyerek mysql optimize edicinin kötü seçimini tamamen ortadan kaldırdık. Bu zor mysql optimizer kötü seçimler veya herhangi bir seçim yapmak için değil, sadece sorguda tanımlandığı gibi JOIN koşulunu izleyin.


Cevabımı InnoDB tablolarında ANALYZE TABLE'ın işe yaramazlığını vurgulamak için güncelledim.
RolandoMySQLDBA

Kardinalitedeki varyanstan bahsettiğinizde yanıtınıza katılıyorum. Kardinalite yaklaşımları dediğimde aynen bunu söylüyordum.
RolandoMySQLDBA

Ayrıca, sorgularda ipuçlarını kullanmanın MySQL Sorgu Optimize Edici bazen bunları ortadan kaldırma eğiliminde olduğunda her zaman yapılacak en iyi şey olmadığını belirtmem gerekiyordu. : İşte aslında veri sorgulama planlarının yerlerinde da ortadan sorgulara içten ne bağlantısıdır dba.stackexchange.com/questions/1371/...
RolandoMySQLDBA

2

MyISAM için ANALİZ TABLOSU tüm tabloyu tarar ve .MYI dosyasına (bence) kaydedilen istatistikleri yeniden oluşturur. Nadiren gereklidir.

InnoDB'nin için TABLOSU ANALİZİ gelmez bir şey yapmak - bu söz dalışı yapıyor. Sorun şu ki, yardımcı olabilir, işleri daha da kötüleştirebilir veya (büyük olasılıkla) görünür bir fark yaratmayacaktır (kardinaliteler hariç).

Daha yeni sürümler, rastgele olmayan 8 probun (1) daha rastgele, (2) "8" i (bunun artıları ve eksileri vardır!) Ve (3) yeniden başlatmalarda tasarruf etmenize izin vermeyi vaat ediyor.

Alt satır: InnoDB hala 'doğru' anlamamış. Hissettiğinizde ANALİZ yapın, ancak nefesinizi tutmayın.

Güncelleme

Yeniden ifade etmek ... ANALYZE TABLEBir sahiptir geçici InnoDB tabloları optimizasyonlara etkisini (muhtemelen yararlı muhtemelen değil).

"Daha yeni sürüm": 5.6.6 (2012) ve MariaDB 10.1 (2014) ile başlayarak, istatistikler çok daha iyi ele alınmaktadır ve ANALYZEşimdi (1) daha az sıklıkla ve (2) daha kalıcıdır.

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.