0

我检查了许多其他 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 万条记录)

我可能遗漏了一些简单的东西,但是对于如何优化此查询的任何建议都将不胜感激。提前致谢。

4

1 回答 1

1

可能有助于在track_report.ip. 请参阅SQL 小提琴

我修改了 where 子句来进行显式比较,现在它使用 from_to_index。

SELECT ip
FROM track_report t, countries_ip ip
where t.ip >= ip.ipfrom and t.ip <= ip.ipto

请参阅SQL 小提琴

于 2012-12-11T11:26:52.977 回答