반응형
인덱스를 사용하지만 테이블 스캔처럼 보이는 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
반응형
'programing' 카테고리의 다른 글
Java에서 Selenium WebDriver를 사용하여 새 탭을 여는 방법 (0) | 2022.11.26 |
---|---|
새 창에서 열린 하위 구성 요소 (0) | 2022.11.26 |
spring-data-jpa를 사용하여 엔티티를 갱신하려면 어떻게 해야 합니까? (0) | 2022.11.26 |
확장 PHP 클래스의 정적 호출에서 클래스 이름을 얻으려면 어떻게 해야 합니까? (0) | 2022.11.25 |
extern 키워드가 C 함수에 미치는 영향 (0) | 2022.11.25 |