MySQLステータス変数Handler_read_rnd_nextは大きく成長しています


11

MYSQLステータスでは、Handler_read_rnd_next値が非常に高くなっています。

この値は、適切なインデックスを持たないクエリが実行されると増加することを認識しています。

ただし、「Handler_read_rnd_next」のようなshow statusを実行しても、この値は2ずつ増加します。

このステータスフラグに基づいて、いくつかの統計情報を監視しています。

そのため、毎回、この統計は重要を示しています。

これらの「表示」実行カウントを「Handler_read_rnd_next」カウントから除外できますか?

このためのもう1つの例は、

10行のテーブルがあり、テーブルは列 'data'にインデックスが付けられています。次のクエリを実行すると、

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

「Handler_read_rnd_next」の値を確認すると、7ずつ増加します。

以下は、上記のクエリのExplainコマンドの結果です。

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'

この値を制限する方法はありますか、またはこの値が非常に速く増加している理由を知ることができますか?


これは実際にパフォーマンスの問題を引き起こしていますか?
アーロンブラウン

パフォーマンスに影響はありませんが、監視ツールはこのフラグをチェックしており、重大を示しています。
Phanindra 2012

パフォーマンスに問題がない場合は、代わりに監視ツールを修正してください。
アーロンブラウン

他のツール(Monyog)でも確認したところ、同じ問題が発生しました。
Phanindra 2012

だから何?パフォーマンスの問題を引き起こしていない場合は無視してください。ただのカウンターです。
アーロンブラウン

回答:


5

まず、Handler_read_rnd_nextの定義を見てみましょう。

Handler_read_rnd_next のMySQLドキュメントによると:

データファイルの次の行を読み取るリクエストの数。多数のテーブルスキャンを実行している場合、この値は高くなります。一般に、これは、テーブルに適切なインデックスが作成されていないか、クエリが作成したインデックスを利用するように作成されていないことを示しています。

次に、クエリを確認します。

select data from test where data = 'vwx';

テーブルには10行あるとおっしゃいました。経験則として、MySQL Query Optimizerは、調査する必要のある行数が行の総数の5%を超える場合、インデックスの使用を却下します。

計算してみましょう。10行の5%は0.5行です。データを特定するために必要な行数が1であっても、それは0.5を超えます。この少ない行数と前述のインデックスルールに基づいて、MySQL Query Optimizerは常にテーブルスキャンを実行します。

data自体にインデックスが付けられているため、テーブルスキャンの代わりに、mysqlはインデックススキャンを実行しました。

テストテーブルが大きくならないことが確実にわかっている場合は、すべてのインデックスを削除して、テーブルスキャンを実行できます。ハンドラーのステータス変数の増加を停止する必要があります。


こんにちは、返信ありがとうございます。インデックスを削除してみて、クエリを実行して値を確認しました。しかし、Handler_read_rnd_nextの値は、インデックスで7ずつ増加していた18ずつ増加しています。私が述べた表は固定されていません。これは例です。テーブルにさらに70行を挿入したため、合計行数は80になり、列 'data'にインデックスを付けて同じクエリを実行しましたが、まだ1行しか返されません。しかし、「Handler_read_rnd_next」の値を確認しても、7ずつ増加しています。このフラグが増加する理由とこれを制限する方法を知ることができますか?
Phanindra 2012年

私が挙げたのとまったく同じ理由がまだ当てはまります。インデックススキャンが実行されました。今回は、完全なインデックスは必要ありませんでした。明らかに、1つの行を取得するには、インデックスのBTREE内の7つのリーフノードをトラバースする必要がありました。ハンドラーステータスカウンターは、インデックスの使用状況を示します。制限する唯一の方法は、私が述べたようにインデックスを完全に削除することです。それ以外の場合、これは常に予期される動作です。より複雑なテーブル構造の適切なインデックス付けと適切に設計されたクエリは、ハンドラーのカウントを軽減できますが、完全に削除することはできません。
RolandoMySQLDBA

「経験則として、MySQLクエリオプティマイザーは、調査する必要がある行の数が行の総数の5%を超える場合、インデックスの使用を却下します。」-これは非常に知っておくと役に立ちます。これをサポートする公式ドキュメントはありますか?どうもありがとうございます!
itoctopus

2

MySQLのバージョンは?

このフラグが増加する理由は、次のドキュメントに記載されています:http : //www.mysqlperformanceblog.com/2010/06/15/what-does-handler_read_rnd-mean/

つまり、テーブルの全体または部分スキャン中に順番にフェッチされた行数のカウンタにすぎません。

今、それは言った、私は別の結果を得ています:

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

「データ」列に一意/プライマリインデックスがある場合、このクエリの最適化は既に完了しています。これでさらに最適化できるとは思えません。

また、FULL TABLE SCANが行われたかどうかを確認できますか?

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

select_scanが値を増やしていないことを確認します。これにより、FULL TABLE SCANが実行されたかどうかを確認できます。FULLTABLE SCANを実行しないクエリを最適化する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.