0

実行に約20秒かかるSQLクエリを最適化しようとしています。

これが私のテーブルの構造です。

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 は索引付けされています。

このクエリを高速化する方法を教えてください。

//編集

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

拡張された説明

4

2 に答える 2

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 に完全に同意し、DB スキーマをより適切な設計に変更します。

于 2012-05-04T14:46:06.113 に答える
0

country_by_ip の範囲を 2 つの個別のインデックスに分割しても、自分に有利にはなりません。これらを KEY ip_range( ip_from, ip_to) に変更してください。

于 2012-05-04T15:20:55.057 に答える