programing

인덱스를 사용하지만 테이블 스캔처럼 보이는 MariaDB SELECT

javaba 2022. 11. 26. 21:19
반응형

인덱스를 사용하지만 테이블 스캔처럼 보이는 MariaDB SELECT

저는 크롤 포스트를 저장하기 위한 매달린 테이블(약 1억 줄)이 있는 MariaDB 10.4를 가지고 있습니다.테이블에는 4개의 열이 있으며, 그 중 하나는lastUpadate(datetime) 및 인덱스.

최근에는 최신 업데이트로 투고를 선택하려고 합니다.대부분의 경우 인덱스를 사용하여 빠르게 반환되지만 반환되는 레코드가 적어 몇 분 정도 걸리는 경우도 있으며 테이블 스캔처럼 보입니다.

조건 없이 설명하는 쿼리입니다.

> explain select 1 from SourceAttr;
+------+-------------+------------+-------+---------------+---------------+---------+------+----------+-------------+
| id   | select_type | table      | type  | possible_keys | key           | key_len | ref  | rows     | Extra       |
+------+-------------+------------+-------+---------------+---------------+---------+------+----------+-------------+
|    1 | SIMPLE      | SourceAttr | index | NULL          | idxCreateDate | 5       | NULL | 79830491 | Using index |
+------+-------------+------------+-------+---------------+---------------+---------+------+----------+-------------+

쿼리 설명과 느린 행에 대해 반환된 행 수입니다.개수rows위의 설명과 거의 동일합니다.

> select 1 from SourceAttr where (lastUpdate >= '2020-01-11 11:46:37' AND lastUpdate < '2020-01-12 11:46:37');
+------+-------------+------------+-------+---------------+---------------+---------+------+----------+--------------------------+
| id   | select_type | table      | type  | possible_keys | key           | key_len | ref  | rows     | Extra                    |
+------+-------------+------------+-------+---------------+---------------+---------+------+----------+--------------------------+
|    1 | SIMPLE      | SourceAttr | index | idxLastUpdate | idxLastUpdate | 5       | NULL | 79827437 | Using where; Using index |
+------+-------------+------------+-------+---------------+---------------+---------+------+----------+--------------------------+

> select 1 from SourceAttr where (lastUpdate >= '2020-01-11 11:46:37' AND lastUpdate < '2020-01-12 11:46:37');
394454 rows in set (14 min 40.908 sec)

이게 빠른 거예요.

> explain select 1 from SourceAttr where (lastUpdate >= '2020-01-15 11:46:37' AND lastUpdate < '2020-01-16 11:46:37');
+------+-------------+------------+-------+---------------+---------------+---------+------+---------+--------------------------+
| id   | select_type | table      | type  | possible_keys | key           | key_len | ref  | rows    | Extra                    |
+------+-------------+------------+-------+---------------+---------------+---------+------+---------+--------------------------+
|    1 | SIMPLE      | SourceAttr | range | idxLastUpdate | idxLastUpdate | 5       | NULL | 3699041 | Using where; Using index |
+------+-------------+------------+-------+---------------+---------------+---------+------+---------+--------------------------+

> select 1 from SourceAttr where (lastUpdate >= '2020-01-15 11:46:37' AND lastUpdate < '2020-01-16 11:46:37');
1352552 rows in set (2.982 sec)

원인이 무엇입니까?

정말 감사해요.

보면type: index'인덱스 스캔'이라고 하죠이것은 거의 테이블 스캔만큼 나쁘다.

주의:rows: 79827437두 개의 느린 쿼리에 대한 설명에서.이것은 스캔된 인덱스의 7천9백만 개 이상의 항목을 검사하고 있다는 것을 의미합니다.idxCreateDate또는idxLastUpdate따라서 기본적으로 모든 인덱스 엔트리를 검사하는 것으로 표의 모든 행을 검사하는 것과 거의 같은 시간이 소요됩니다.

퀵 쿼리에 따르면rows: 3699041검사한 행이 370만 개 미만인 것으로 추정됩니다.20배 이상 적습니다.

언급URL : https://stackoverflow.com/questions/60881051/mariadb-select-with-index-used-but-looks-like-table-scan

반응형