我检查了许多其他 SO 帖子和 MySQL 文档,但似乎无法得到关于为什么不使用索引以及如何强制使用它的答案 - 我可以看到许多其他人也有类似的问题,但是找不到解决方案。
桌子看起来像这样
CREATE TABLE `countries_ip` (
`ipfrom` INT(10) UNSIGNED ZEROFILL NOT NULL,
`ipto` INT(10) UNSIGNED ZEROFILL NOT NULL,
`countrySHORT` CHAR(2) NULL DEFAULT NULL,
`country_id` INT(10) UNSIGNED NOT NULL,
PRIMARY KEY (`ipfrom`, `ipto`, `country_id`),
INDEX `from_to_index` (`ipfrom`, `ipto`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;
不知道为什么“from_to_index”在那里——对我来说似乎是多余的。但无论如何,EXPLAIN 查询看起来像这样
EXPLAIN SELECT *
FROM track_report t, countries_ip ip
WHERE t.ip BETWEEN ip.ipfrom AND ip.ipto
EXPLAIN 的结果如下:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t ALL getwebmaster NULL NULL NULL 36291
1 SIMPLE ip ALL PRIMARY,from_to_index NULL NULL NULL 153914 Range checked for each record (index map: 0x3)
如您所见,countries_ip
表中的 PRIMARY KEY 没有被使用,因此查询需要很长时间(countries_ip
有超过 15 万条记录)
我可能遗漏了一些简单的东西,但是对于如何优化此查询的任何建议都将不胜感激。提前致谢。