我有一个简单的SELECT查询,它使用5个整数值的WHERE IN在一个大约2000万行的表中得到50个结果。这是查询:
select `prf_profiles_id` as `id`, `first`, `last`, `suffix` from `prf_names`
where prf_names`.`src_sources_id` in (9, 10, 11, 34, 37) limit 50 offset 0;
查询的解释值:
select_type: SIMPLE
table: prf_names
type: ALL
possible_keys: prf_names_src_sources_id_index
key: NULL
ref: NULL
rows: 20012960
Extra: Using where
可以看出,查询知道索引是可能的,但选择不使用它,因此查询大约需要4.5秒。
src_sources_id
已编入索引,并包含应用于所有2000万行的约20个不同值。
我知道索引会有很大的帮助,因为当我使用FORCE INDEX运行相同的查询时:
select `prf_profiles_id` as `id`, `first`, `last`, `suffix` from `prf_names`
force index (prf_names_src_sources_id_index)
where `prf_names`.`src_sources_id` in (9, 10, 11, 34, 37) limit 50 offset 0;
查询时间不到0.0秒。
我想避免强制MySQL使用索引,因为通过ORM调用查询并强制它会破坏首先使用ORM的一些目的。
我可以做些什么来确保MySQL使用此索引?
这是create table语句:
CREATE TABLE `prf_names` (
`prf_profiles_id` int(10) unsigned NOT NULL,
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`created` datetime NOT NULL,
`verified` datetime NOT NULL,
`title` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
`first` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
`middle` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
`last` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
`suffix` varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL,
`sanitized` enum('yes','no') COLLATE utf8_unicode_ci NOT NULL DEFAULT 'no',
`src_sources_id` int(10) unsigned NOT NULL,
PRIMARY KEY (`prf_profiles_id`,`id`),
UNIQUE KEY `prf_names_id_unique` (`id`),
KEY `prf_names_first_index` (`first`),
KEY `prf_names_middle_index` (`middle`),
KEY `prf_names_last_index` (`last`),
KEY `prf_names_src_sources_id_index` (`src_sources_id`)
) ENGINE=InnoDB AUTO_INCREMENT=31633081 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci