优化SQL查询

时间:2012-05-04 13:54:15

标签: mysql sql indexing

我正在尝试优化sql查询,现在需要大约20秒才能执行。

这是我桌子的结构。

last_login

id | ip_address |when
1    2130706433 2012-05-04 12:00:36

country_by_ip

ip_from | ip_to | country
16843008 | 16843263 | CN

这是我使用的查询:

SELECT 
ll.ip_address,
ll.when,
cbi.country
FROM last_login ll
LEFT JOIN `country_by_ip` cbi on ll.ip_address BETWEEN  cbi.ip_from AND cbi.ip_to

字段ip_from和ip_to已编入索引。

你能推荐我如何加快这个查询的速度吗?

// EDIT

CREATE TABLE `last_login` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `ip_address` int(11) unsigned NOT NULL,
  `when` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=32 DEFAULT CHARSET=utf8


CREATE TABLE `country_by_ip` (
  `ip_from` int(20) unsigned NOT NULL,
  `ip_to` int(20) DEFAULT NULL,
  `country` varchar(255) DEFAULT NULL,
  KEY `ip_from` (`ip_from`),
  KEY `ip_to` (`ip_to`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

EXPLAIN EXTENDED

2 个答案:

答案 0 :(得分:1)

怎么样:

SELECT 
ll.ip_address,
ll.when,
cbi.country
FROM last_login ll
LEFT JOIN `country_by_ip` cbi on ll.ip_address > cbi.ip_from 
WHERE ll.ip_address < cbi.ip_to

但是,我完全同意@Romain,更改数据库架构以更好地设计。

答案 1 :(得分:0)

通过将country_by_ip范围分成2个sperate索引,你不会给自己带来任何好处 - 将其更改为KEY ip_rangeip_fromip_to)。