쿼리 성능 문제를 해결하는 중입니다.키가 존재할 때 InnoDB가 테이블 스캔을하고, 70 배 더 많은 행을 검사하도록 선택하는 이유는 무엇입니까?
mysql> explain select * from table1 where tdcol between '2010-04-13 00:00' and '2010-04-14 03:16';
+----+-------------+--------------------+-------+---------------+--------------+---------+------+---------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------------------+-------+---------------+--------------+---------+------+---------+-------------+
| 1 | SIMPLE | table1 | range | tdcol | tdcol | 8 | NULL | 5437848 | Using where |
+----+-------------+--------------------+-------+---------------+--------------+---------+------+---------+-------------+
1 row in set (0.00 sec)
의미가 인덱스 이름 tdcol (KEY tdcol (tdcol)
)을 사용, 약 5M 행이 쿼리에서 선택해야하기 때문에, 다음은 설명에서 예상되는 쿼리 계획이다. 내가 데이터를 하나 더 분 동안 질의 경우
그러나, 우리는이 쿼리 계획을 얻을 :
mysql> explain select * from table1 where tdcol between '2010-04-13 00:00' and '2010-04-14 03:17';
+----+-------------+--------------------+------+---------------+------+---------+------+-----------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------------------+------+---------------+------+---------+------+-----------+-------------+
| 1 | SIMPLE | table1 | ALL | tdcol | NULL | NULL | NULL | 381601300 | Using where |
+----+-------------+--------------------+------+---------------+------+---------+------+-----------+-------------+
1 row in set (0.00 sec)
최적화는 검색이 잘 될 것이라고 생각하지만, 너무, 70 배 이상 더 많은 행이 검사의 나는 테이블 스캔이 더 좋다고 믿기가 힘듭니다.
또한 'USE KEY tdcol'구문은 쿼리 계획을 변경하지 않습니다.
도움을 주셔서 감사 드리며, 더 많은 정보/질문에 답해 드리겠습니다.
첫 번째 쿼리의 첫 번째 날짜에 여분의 콜론이 잘못된 복사/붙여 넣기가 있습니까? –
은 날짜 키 – DRapp
예 great_llama에서 간단해야하며, 이는 잘못된 복사 및 붙여 넣기입니다. 편집 됨. – andysk