색인 [status, name, id]이있는 테이블 user [id, name, status]가 있습니다.
SELECT *
FROM user
WHERE status = 'active'
ORDER BY name, id
LIMIT 50
상태 == '활성'인 약 50000 명의 사용자가 있습니다.
1.) MySQL Explain이 ROWS 열에 약 50000을 표시하는 이유는 무엇입니까? 인덱스 열이 order by 절과 같더라도 모든 리프 노드를 따르는 이유는 무엇입니까?
2.) order by 조항을 다음과 같이 변경하는 경우
ORDER BY status, name, id
Explain 절의 EXTRA 열은 다음을 표시합니다.
색인 조건 사용; 어디에 사용; 파일 정렬 사용
이 쿼리에서 인덱스 순서를 사용할 수없는 이유가 있습니까?
edit1 :
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`status` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `status_name_id` (`status`,`name`,`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
질문:
SELECT *
FROM `user`
WHERE status = 'complete'
ORDER BY status, name, id
LIMIT 50
설명:
id: 1
select_type: SIMPLE
table: f_order
type: ref
possible_keys: status_name_id
key: status_name_id
key_len: 768
ref: const
rows: 50331
Extra: "Using where; Using index; Using filesort"
가장 이상한 점은 SELECT 문을 다음과 같이 변경하면
SELECT *, count(id)
인덱스를 다시 사용하고 쿼리가 두 배 더 빠릅니다. 그리고 추가 섹션에는
Using where; Using index
테이블에는 10 만 개의 행, 5 개의 서로 다른 상태 및 12 개의 서로 다른 이름이 있습니다.
MySQL : 5.6.27
edit2 :
다른 예시:
400ms (avg)가 걸리며 명시 적 정렬을 수행합니다.
SELECT *
FROM `user`
WHERE status IN('complete')
ORDER BY status, name, id
LIMIT 50
이것은 2ms (avg)가 걸리며 명시 적으로 정렬하지 않습니다.
SELECT *
FROM `user`
WHERE status IN('complete', 'something else')
ORDER BY status, name, id
LIMIT 50
의견에 따르면 아마도 버그 일 것입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다