MySQL 상태 변수 Handler_read_rnd_next가 많이 성장하고 있습니다


11

MYSQL 상태에서 Handler_read_rnd_next 값이 매우 높습니다.

적절한 인덱스가없는 쿼리가 실행될 때이 값이 증가한다는 것을 알고 있습니다.

그러나 'Handler_read_rnd_next'와 같은 show status를 실행하더라도이 값은 2 씩 증가합니다.

이 상태 플래그를 기반으로 일부 통계를 모니터링하고 있습니다.

따라서이 통계는 항상 중요합니다.

'Handler_read_rnd_next'카운트에서 'show'실행 횟수를 제외 할 수 있습니까?

이것에 대한 또 하나의 예,

행이 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'

이 값을 제한 할 수있는 방법이 있습니까? 아니면이 값이 매우 빠르게 증가하는 이유를 알 수 있습니까?


실제로 성능 문제가 발생합니까?
Aaron Brown

성능에는 영향을 미치지 않지만 모니터링 도구는이 플래그를 확인하여 중요하게 표시합니다.
Phanindra

성능에 문제가 없으면 대신 모니터링 도구를 수정하십시오.
Aaron Brown

다른 도구 (Monyog)도 확인했지만 동일한 문제가 있습니다.
Phanindra

그래서 무엇? 성능 문제를 일으키지 않으면 무시하십시오. 카운터 일뿐입니다.
Aaron Brown

답변:


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의 값은 18 씩 증가하고 인덱스는 7 씩 증가합니다. 내가 언급 한 표는 고정되어 있지 않습니다. 예를 들어, 테이블에 70 행을 더 삽입했기 때문에 총 행은 80이고 'data'열의 인덱스로 동일한 쿼리를 실행하여 여전히 하나의 행만 반환합니다. 그러나 여전히 'Handler_read_rnd_next'의 값을 확인하면 여전히 7 씩 증가합니다.이 플래그가 증가하는 이유와이를 제한하는 방법을 알 수 있습니다.
Phanindra

내가 준 것과 똑같은 이유가 여전히 적용됩니다. 인덱스 스캔이 수행되었습니다. 이번에는 전체 인덱스가 필요하지 않았습니다. 분명히, 인덱스의 BTREE에있는 7 개의 리프 노드는 한 행을 얻기 위해 통과해야했습니다. 처리기 상태 카운터는 인덱스 사용량을 나타냅니다. 제한하는 유일한 방법은 내가 언급 한대로 인덱스를 완전히 제거하는 것입니다. 그렇지 않으면 항상 예상되는 동작입니다. 보다 복잡한 테이블 구조와 올바르게 설계된 쿼리의 인덱스를 개선하면 핸들러 수를 줄일 수는 있지만 완전히 제거 할 수는 없습니다.
RolandoMySQLDBA

"일반적으로 MySQL Query Optimizer는 검사해야하는 행 수가 총 행 수의 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의 수행 여부를 확인할 수 있습니다. FULL TABLE SCAN을 수행하지 않는 쿼리를 최적화해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.