다음과 같이 값과 해시 테이블을 고려하십시오.
+------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+----------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| val | char(9) | NO | | NULL | |
| val_hashed | char(50) | YES | | NULL | |
+------------+----------+------+-----+---------+----------------+
다음 쿼리는 0.00 초 후에 완료됩니다.
SELECT * FROM hashes ORDER BY 1 DESC LIMIT 1;
그러나이 쿼리는 3 분 17 초가 걸립니다.
SELECT val FROM hashes ORDER BY 1 DESC LIMIT 1;
쿼리가 실행되는 동안 프로세스 목록에 상태가 표시 Sorting result
됩니다. 상황은 완전히 재현 가능합니다. INSERT
테이블에서 작업을 지속적으로 수행하는 다른 프로세스가 있습니다.
더 구체적인 쿼리가 *
쿼리 보다 실행하는 데 더 오래 걸리는 이유는 무엇 입니까? 나는 항상 *
성능상의 이유로 쿼리를 피해야 한다고 믿었습니다 .
ORDER BY NUMBER
구문은 매우 발생하기 쉬운 오류입니다.
SELECT *
의 열 인덱스와 결합하는 것은 ORDER BY
방지 할 수있는 또 다른 이유 - 분류되는 열 난독이다 *
의 ...
*
명시 적이 지 않다는 것을 의미한다 . 그래서 "모든 열을주고 세 번째 열을 기준으로 정렬"이라고 말하는 것은 "슈퍼마켓으로 가서 몇 개의 신호등을 통과했는지 알려주는 것"과 같이 결정 론적
id
하여 첫 번째 행을 찾습니다. 두 번째는 (인덱싱되지 않은)val
열 에서 전체 결과를 정렬해야합니다 .