반응형
더 큰 쿼리를 최적화하려고 시도하고 쿼리의이 부분이 전체 테이블 스캔을 수행하고 있다는 것을 깨달았을 때이 벽에 부딪 혔습니다. 문제의 필드가 기본 키라는 점을 고려하면 이치에 맞지 않습니다. MySQL Optimizer가 색인을 사용할 것이라고 가정 합니다.
다음은 표입니다.
CREATE TABLE userapplication (
application_id int(11) NOT NULL auto_increment,
userid int(11) NOT NULL default '0',
accountid int(11) NOT NULL default '0',
resume_id int(11) NOT NULL default '0',
coverletter_id int(11) NOT NULL default '0',
user_email varchar(100) NOT NULL default '',
account_name varchar(200) NOT NULL default '',
resume_name varchar(255) NOT NULL default '',
resume_modified datetime NOT NULL default '0000-00-00 00:00:00',
cover_name varchar(255) NOT NULL default '',
cover_modified datetime NOT NULL default '0000-00-00 00:00:00',
application_status tinyint(4) NOT NULL default '0',
application_created datetime NOT NULL default '0000-00-00 00:00:00',
application_modified timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
publishid int(11) NOT NULL default '0',
application_visible int(11) default '1',
PRIMARY KEY (application_id),
KEY publishid (publishid),
KEY application_status (application_status),
KEY userid (userid),
KEY accountid (accountid),
KEY application_created (application_created),
KEY resume_id (resume_id),
KEY coverletter_id (coverletter_id),
) ENGINE=MyISAM ;
이 간단한 쿼리는 전체 테이블 스캔을 수행하는 것 같습니다.
SELECT * FROM userapplication WHERE application_id > 1025;
이것은 EXPLAIN의 출력입니다.
+----+-------------+-------------------+------+---------------+------+---------+------+--------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------------------+------+---------------+------+---------+------+--------+-------------+ | 1 | SIMPLE | userapplication | ALL | PRIMARY | NULL | NULL | NULL | 784422 | Using where | +----+-------------+-------------------+------+---------------+------+---------+------+--------+-------------+`
이 간단한 쿼리가 전체 테이블 스캔을 수행하는 것을 방지하는 방법에 대한 아이디어가 있습니까? 아니면 내가 운이 좋지 않습니까?
해결 방법
MyISAM
테이블은 클러스터되지 않고 PRIMARY KEY
인덱스는 보조 인덱스이며 다른 값을 가져 오려면 추가 테이블 조회가 필요합니다.
인덱스를 순회하고 조회를 수행하는 것은 몇 배 더 비쌉니다. 조건이 선택적이지 않은 경우 (총 레코드의 많은 부분을 차지함) MySQL
은 테이블 스캔을 더 저렴하게 고려합니다.
테이블 스캔을 방지하기 위해 힌트를 추가 할 수 있습니다.
SELECT *
FROM userapplication FORCE INDEX (PRIMARY)
WHERE application_id > 1025
, 반드시 더 효율적인 것은 아닙니다.
참조 페이지 https://stackoverflow.com/questions/4691799
반응형
'MySql' 카테고리의 다른 글
MySQL 하나의 문 내에서 MySQL의 자동 증가 값에 액세스 할 수 있습니까? (0) | 2020.10.22 |
---|---|
MySQL PHP의 하위 쿼리 (0) | 2020.10.22 |
MySQL 데이터베이스 용 "데이터 사전"을 만드는 유틸리티 (0) | 2020.10.22 |
MySQL에서 255보다 큰 값으로 VARCHAR를 선언하는 것이 현명합니까? (0) | 2020.10.22 |
MySQL 여러 테이블에서 동일한 열 선택 (0) | 2020.10.22 |
댓글