본문 바로가기
MySql

MySQL이 비교를 위해 인덱스를 사용하지 않는 이유는 무엇입니까?

by 베이스 공부 2020. 10. 22.
반응형

더 큰 쿼리를 최적화하려고 시도하고 쿼리의이 부분이 전체 테이블 스캔을 수행하고 있다는 것을 깨달았을 때이 벽에 부딪 혔습니다. 문제의 필드가 기본 키라는 점을 고려하면 이치에 맞지 않습니다. 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

 

 

반응형

댓글