0

つまり、基本的に3つのテーブルがあります。

CREATE TABLE `cdIPAddressToLocation` (
  `IPADDR_FROM` int(10) unsigned NOT NULL COMMENT 'Low end of the IP Address block',
  `IPADDR_TO` int(10) unsigned NOT NULL COMMENT 'High end of the IP Address block',
  `IPLOCID` int(10) unsigned NOT NULL COMMENT 'The Location ID for the IP Address range',
  PRIMARY KEY  (`IPADDR_TO`),
  KEY `Index_2` USING BTREE (`IPLOCID`),
  KEY `Index_3` USING BTREE (`IPADDR_FROM`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE `cdIPLocation` (
  `IPLOCID` int(10) unsigned NOT NULL default '0',
  `Country` varchar(4) default NULL,
  `Region` int(10) unsigned default NULL,
  `City` varchar(90) default NULL,
  `PostalCode` varchar(10) default NULL,
  `Latitude` float NOT NULL,
  `Longitude` float NOT NULL,
  `MetroCode` varchar(4) default NULL,
  `AreaCode` varchar(4) default NULL,
  `State` varchar(45) default NULL,
  `Continent` varchar(10) default NULL,
  PRIMARY KEY  (`IPLOCID`)
) ENGINE=MyISAM AUTO_INCREMENT=218611 DEFAULT CHARSET=latin1;

CREATE TABLE 'data'{
 'IP' varchar(50)
 'SCORE' int
}

私の仕事は、これら3つのテーブルを結合して、指定されたIPアドレスのロケーションデータを見つけることです。私の質問は次のとおりです。

select 
    t.ip,
    l.Country,
    l.State,
    l.City,
    l.PostalCode,
    l.Latitude,
    l.Longitude,
    t.score
from
    (select 
        ip, inet_aton(ip) ipv, score
    from
        data
    order by score desc
    limit 5) t
        join
    cdIPAddressToLocation a ON t.ipv between a.IPADDR_FROM and a.IPADDR_TO
        join
    cdIPLocation l ON l.IPLOCID = a.IPLOCID

このクエリは機能しますが、非常に遅く、開発ボックスに結果を返すのに約100秒かかりました。

私はmysql5.1を使用していますが、cdIPAddressToLocationには590万行、cdIPLocationテーブルには約30万行があります。

実行プランを確認したところ、テーブル'cdIPAddressToLocation'のインデックスが使用されていないことがわかりました。そのため、'data'テーブルの各行に対して、テーブル'cdIPAddressToLocation'に対して全表スキャンが実行されます。それは私には非常に奇妙です。つまり、テーブル'cdIPAddressToLocation'の列'IPADDR_FROM'と'IPADDR_TO'にはすでに2つのインデックスがあるため、実行プランではインデックスを活用してパフォーマンスを向上させる必要がありますが、なぜそれらを使用しなかったのでしょうか。

または、私のクエリに何か問題がありましたか?

助けてください、どうもありがとう。

4

1 に答える 1

0

cdIPAddressToLocation.IPADDR_FROM列とcdIPAddressToLocation.IPADDR_TO列で複合インデックスを使用してみましたか?

複数列のインデックス

于 2012-05-25T21:32:56.263 に答える