특정 쿼리를 실행하는 파일 정렬을 피하기 위해 테이블에 대한 인덱스를 선택하도록 도와주십시오.파일 정렬 사용을 피하기 위해 인덱스 최적화
그래서, 두 개의 테이블 demo_user
및 demo_question
이 있습니다 :
CREATE TABLE `demo_user` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL,
`age` INT(11) NOT NULL,
PRIMARY KEY (`id`),
INDEX `age` (`age`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;
CREATE TABLE `demo_question` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`userId` INT(11) NOT NULL,
`createdAt` DATETIME NOT NULL,
`question` VARCHAR(50) NOT NULL,
PRIMARY KEY (`id`),
INDEX `userId` (`userId`),
INDEX `createdAt` (`createdAt`),
CONSTRAINT `FK_demo_question_demo_user` FOREIGN KEY (`userId`) REFERENCES `demo_user` (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;
일부 샘플 데이터 :
select *
from demo_question q
left join demo_user u on q.userId = u.id
where u.age >= 20 and u.age <= 30
order by q.createdAt desc
: 나는 다음과 같은 쿼리를 실행하려고이 테이블에
INSERT INTO `demo_user` VALUES ('u1', 20);
INSERT INTO `demo_user` VALUES ('u2', 25);
INSERT INTO `demo_user` VALUES ('u3', 27);
INSERT INTO `demo_user` VALUES ('u4', 33);
INSERT INTO `demo_user` VALUES ('u5', 19);
INSERT INTO `demo_question` VALUES (2, '2014-01-19 15:17:13', 'q1');
INSERT INTO `demo_question` VALUES (3, '2014-01-19 15:17:43', 'q2');
INSERT INTO `demo_question` VALUES (5, '2014-01-19 15:17:57', 'q3');
이 쿼리에 대한 설명은 결과를 0123으로 정렬하는 동안 filesort를 감지합니다. 91,열
+----+-------------+-------+------+---------------+------+---------+------+------+---------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+---------------------------------+
| 1 | SIMPLE | q | ALL | userId | NULL | NULL | NULL | 3 | Using temporary; Using filesort |
| 1 | SIMPLE | u | ALL | PRIMARY,age | NULL | NULL | NULL | 5 | Using where; Using join buffer |
+----+-------------+-------+------+---------------+------+---------+------+------+---------------------------------+
그래서 내 질문 : 같은 쿼리를 실행하는 동안 두 테이블의 행 더 많은이 때 성능이 저하하기 때문에, filesorting을 방지하기 위해 무엇을 할 수 있는지?
mysql이 너무 어리 석다는 것을 알기 위해 왼쪽 결합이 아닌 내부 결합으로 시도하십시오. –
@Denis 안타깝게도 내부 조인은 아무 것도 바뀌지 않습니다 – gatisl
demo_question에서 2 개의 인덱스가 아니라 두 개의 열을 inndex에 넣으십시오. 즉 INDEX'userId' ('userId')는 INDEX'userId' ('userId','createdAt')가됩니다 –