MySQL durum değişkeni Handler_read_rnd_next çok büyüyor


11

MYSQL durumunda, Handler_read_rnd_next değeri çok yüksektir.

Uygun değerlere sahip olmayan bir sorgu yürütüldüğünde bu değerin artırılacağını biliyorum.

Ancak, 'Handler_read_rnd_next' gibi şov durumunu gerçekleştirsek bile, bu değer 2 artırılır.

Bu durum işaretini temel alarak bazı istatistikleri izliyoruz.

Yani her seferinde bu istatistikler kritik öneme sahip.

Bu 'show' yürütme sayılarını 'Handler_read_rnd_next' sayısından hariç tutabilir miyiz?

Bunun için bir örnek daha,

10 satırlı bir tablo var, tablo 'veri' sütununda dizine eklenmiş ve aşağıdaki sorguyu yürütürsek:

select data from test where data = 'vwx' -> returns one row

ve 'Handler_read_rnd_next' değerini kontrol edersek, 7 artar.

Yukarıdaki sorgu için açıkla komutunun sonucu aşağıdadır:

explain select data from test where data = 'vwx';

id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra

1, 'SIMPLE', 'test', 'ref', 'data', 'data', '35', 'const', 1, 'Using where; Using index'

Bu değeri kısıtlamanın herhangi bir yolu var mı, ya da neden bu değerin çok hızlı arttığını öğrenebilir miyim.


Bu aslında bir performans sorununa neden oluyor mu?
Aaron Brown

Hiçbir performans etkilenmez, ancak izleme aracı bu bayrağı kontrol eder ve kritik gösterir.
Phanindra

Performans sorun değilse, bunun yerine izleme aracını düzeltin.
Aaron Brown

Ben de (Monyog) diğer araçları ile kontrol vardı, aynı sorun var.
Phanindra

ne olmuş yani? Performans sorununa yol açmıyorsa yok sayın. Bu sadece bir sayaç.
Aaron Brown

Yanıtlar:


5

Her şeyden önce, Handler_read_rnd_next tanımına bakalım.

Handler_read_rnd_next üzerindeki MySQL Belgelerine göre :

Veri dosyasındaki bir sonraki satırı okuma isteği sayısı. Çok fazla tablo taraması yapıyorsanız bu değer yüksektir. Genellikle bu, tablolarınızın uygun şekilde dizine eklenmediğini veya sahip olduğunuz dizinlerden yararlanmak için sorgularınızın yazılmadığını gösterir.

Şimdi sorgunuza bakın:

select data from test where data = 'vwx';

Masanın 10 sıra olduğunu söyledin. Genel bir kural olarak, incelenmesi gereken satır sayısı toplam satır sayısının% 5'inden fazlaysa MySQL Sorgu Optimize Edici bir endeks kullanımını reddedecektir.

Matematik yapalım. 10 satırın% 5'i 0,5 satırdır. Verilerinizi bulmak için satır sayısı 1 olsa bile, bu 0,5'ten fazladır. Bu daha az sayıda satır ve az önce bahsettiğim endeks kuralına dayanarak, MySQL Query Optimizer her zaman bir tablo taraması yapacaktır.

Sütunun datakendisi bir tablo taraması yerine dizinlendiğinden, mysql bir dizin taraması gerçekleştirildi.

Sınama tablosunun asla büyümeyeceğinden emin olursanız, tüm dizinleri kaldırabilir ve tablo taramalarının yapılmasına izin verebilirsiniz. İşleyici durum değişkenleri artmayı durdurmalıdır.


Merhaba, cevap için teşekkürler. Dizini kaldırarak denedim ve sorgu yürüterek değeri kontrol. Ancak Handler_read_rnd_next değeri indeks ile 7 artarak 18 artar. Bahsettiğim tablo sabit değil. Bu bir örnek olarak, tabloya 70 satır daha ekledim, bu yüzden toplam satır 80'dir ve aynı sorguyu 'veri' sütunundaki dizinle aynı sorguyu yürütür. Ama yine de 'Handler_read_rnd_next' nin değerini kontrol ettiğimde, hala 7 artar.
Phanindra

Verdiğim aynı nedenler hala geçerli. Bir indeks taraması yapıldı. Bu kez tam bir indeks gerekli değildi. Açıkça görülüyor ki, bir satırın elde edilebilmesi için endeksin BTREE'sindeki 7 yaprak düğümü çaprazlanmalıdır. İşleyici durum sayaçları dizin kullanımını gösterir. Kısıtlamanın tek yolu, belirttiğim gibi dizini tamamen kaldırmaktır. Aksi takdirde, bu her zaman beklenen davranıştır. Daha karmaşık tablo yapılarının daha iyi indekslenmesi ve uygun şekilde tasarlanmış sorgular işleyici sayımını azaltabilir, ancak bunları asla tamamen kaldıramaz.
RolandoMySQLDBA

"Genel bir kural olarak, incelenmesi gereken satır sayısı toplam satır sayısının% 5'inden fazlaysa MySQL Sorgu Optimize Edici bir endeks kullanımını reddeder." - Bunu bilmek çok faydalıdır. Bunu destekleyen resmi bir belge var mı? Çok teşekkür ederim!
itoctopus

2

MySQL'in hangi sürümü?

Bu bayrağın artmasının nedenleri en iyi burada belgelenmiştir: http://www.mysqlperformanceblog.com/2010/06/15/what-does-handler_read_rnd-mean/

Kısacası, tam veya kısmi tablo taraması sırasında sıraya getirilen satır sayısının sayacıdır.

Şimdi, farklı bir sonuç alıyorum:

mysql> CREATE TABLE `test` (
    ->   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    ->   `data` varchar(255) NOT NULL,
    ->   PRIMARY KEY (`id`),
    ->   KEY `data` (`data`)
    -> ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.27 sec)

mysql> INSERT INTO test (data) VALUES ('a'), ('b'), ('c'), ('d'), ('e'), ('f'), ('g'), ('h'), ('i'), ('vwx');
Query OK, 10 rows affected (0.06 sec)
Records: 10  Duplicates: 0  Warnings: 0

mysql> FLUSH STATUS;
Query OK, 0 rows affected (0.07 sec)

mysql> select data from test where data = 'vwx';
+------+
| data |
+------+
| vwx  |
+------+
1 row in set (0.04 sec)

mysql> SHOW SESSION STATUS LIKE 'Handler%';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Handler_commit             | 1     |
| Handler_delete             | 0     |
| Handler_discover           | 0     |
| Handler_prepare            | 0     |
| Handler_read_first         | 0     |
| Handler_read_key           | 3     |
| Handler_read_last          | 0     |
| Handler_read_next          | 1     |
| Handler_read_prev          | 0     |
| Handler_read_rnd           | 0     |
| Handler_read_rnd_next      | 0     |
| Handler_rollback           | 0     |
| Handler_savepoint          | 0     |
| Handler_savepoint_rollback | 0     |
| Handler_update             | 0     |
| Handler_write              | 0     |
+----------------------------+-------+
16 rows in set (0.15 sec)

0

"Veri" sütununda bir Benzersiz / birincil dizin varsa, bu sorgu için zaten optimizasyon yaptınız. Bu konuda daha fazla optimizasyon yapılabileceğini düşünemiyorum.

Ayrıca TAM TABLO TARAMA yapılıp yapılmadığını doğrulayabilirsiniz?

SHOW STATUS like 'select_scan'; 
SELECT data from test where data='vmx';
SHOW STATUS like 'select_scan'; 

Select_scan değerinin artmadığından emin olun, bu şekilde TAM TABLO TARAMA'nın yapılıp yapılmadığını kontrol edebilirsiniz, TAM TABLO TARAMA yapmayacak bir sorguyu optimize etmeye çalışmalısınız.

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.