3 백만 레코드가있는 테이블에서 가장 효율적인 선택을 수행하려고합니다.복수/단일 열 인덱스가있는 범위 쿼리에서 MySQL 효율적인 선택/정렬
우선 몇 가지 자세한 정보를 원하시면
테이블 :
CREATE TABLE IF NOT EXISTS `activities_index` (
`id` int(9) NOT NULL auto_increment,
`activity_id` int(6) NOT NULL,
`activity_status_id` int(2) NOT NULL,
`activity_source_id` int(6) default NULL,
`account_id` int(6) default NULL,
`owner_account_id` int(4) default NULL,
`date` date NOT NULL,
`is_event` int(1) NOT NULL,
`name` varchar(255) collate utf8_unicode_ci NOT NULL,
`content` longtext collate utf8_unicode_ci,
`location_name` varchar(255) collate utf8_unicode_ci default NULL,
`location_content` longtext collate utf8_unicode_ci,
`meta_keywords` varchar(255) collate utf8_unicode_ci default NULL,
`thumb_filename` varchar(255) collate utf8_unicode_ci default NULL,
`popular` int(1) NOT NULL default '0',
`price` float default NULL,
`city_id` int(9) default NULL,
`province_id` int(4) default NULL,
`country_id` int(4) default NULL,
`activity_location_id` int(6) NOT NULL,
`lat` decimal(10,6) default NULL,
`lng` decimal(10,6) default NULL,
`activity_modified` datetime default NULL,
`activity_created` datetime NOT NULL,
`activity_location_modified` datetime default NULL,
`activity_location_created` datetime NOT NULL,
`modified` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `is_event_idx` (`is_event`),
KEY `activity_id_idx` (`activity_id`),
KEY `status_city_idx` (`activity_status_id`, `city_id`),
KEY `date_idx` (`date`),
FULLTEXT KEY `txt_fields_idx` (`name`,`location_name`,`meta_keywords`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=14865 ;
검색어 : 내 인덱스 선택에 대해
SELECT SQL_NO_CACHE * FROM `activities_index` WHERE
date BETWEEN '2009-12-23' AND '2010-1-23' AND
activity_status_id = 1 AND
city_id IN ('86', '84', '87', '2381', '453', '137', '1561', '1116', '1614', '2456', '512', '305', '443', '1182', '2229')
ORDER BY date
LIMIT 25
:
주요 문제는 DATE의 범위 선택입니다. 왜 내가 믿는 것을 기반으로 다중 컬럼 인덱스를 사용하지 않는가? 내가 틀렸다면 나를 바로 잡아라. MySQL은 범위 뒤의 인덱스를 사용하지 않는다. 따라서 색인 (DATE, ACTIVITY_STATUS_ID, CITY_ID)은 쓸모가 없습니다. 오른쪽 접두사를 사용할 때만 인덱스 테이블에서 순서가 올바릅니다. 따라서 CITY_ID, ACTIVITY_STATUS_ID, DATE의 다중 컬럼 인덱스는 DATE 컬럼에 데이터를 정렬하고자하므로 정확한 정렬 결과를 제공하지 않습니다.
설명 :
것은이 DATE에 의해 주문시 대신 내가 DATE_IDX에 그 순서를 뒤집어 생각 DATE_STATUS_IDX이 CITY_IDX보다 효율적으로 될 것이라고이 possible_keys 순서가 CITY_IDX 인 쿼리에 EXPLAIN 수행 할 때.
id select_type table type possible_keys key key_len ref rows Extra<br />
1 SIMPLE activities_index range city_idx,date_idx city_idx 5 NULL 1363 Using where; Using filesort
내 질문 :
어떻게 내가이 possible_keys의 순서를 전환 할 수 있습니다?
문제를 해결하는 더 좋은 방법 : 300 만 레코드가있는 테이블을 효율적으로 선택 하시겠습니까?
내 사고 방식이 올바른 것입니까?
테이블 정의에는 도시에 대한 단일 색인이 없지만 Explain 출력이있는 것처럼 보입니다. 다른 버전의 테이블에 출력 된 것입니까? –