2

郵便番号データベースを取得し、特定の半径内の他の郵便番号までの距離を事前に計算しました。データベース自体は約 2.5GB ありますので、特別なことではありません。

これを行う目的は、次のことができるようにすることです。

select * from zipcode_distances where zipcode_from=92101 and distance < 10;

これまでのところ、私が定義した唯一のインデックスは次のとおりです。

(zipcode_from, distance)

ただし、クエリを実行して結果を取得するには、約 20 秒かかります。

and distance < 10" " 句を削除すると、結果は瞬時に得られます。

アドバイスをいただければ幸いです。

編集:

作成ステートメントは次のとおりです。

delimiter $$

CREATE TABLE `zipcode_distances` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `zipcode_from` char(5) COLLATE utf8_bin NOT NULL,
  `zipcode_to` char(5) COLLATE utf8_bin NOT NULL,
  `distance` double unsigned NOT NULL COMMENT 'stored in miles',
  PRIMARY KEY (`id`),
  KEY `idx_zip_from_distance` (`zipcode_from`,`distance`)
) ENGINE=MyISAM AUTO_INCREMENT=62548721 DEFAULT CHARSET=utf8 COLLATE=utf8_bin$$

説明は次のとおりです。

explain extended select * from zipcode_distances where zipcode_from=90210 and distance < 10;

結果:

id、select_type、table、possible_keys、key、key_len、ref、rows、filtered、Extra 1、SIMPLE、zipcode_distances、ALL、idx_zip_from_distance、null、null、null、62548720、100.00、where の使用

ありがとうございました!

4

1 に答える 1

3

クエリにインデックスを使用する MySQL に問題はありません。92101 からの型変換が混乱を招くのではないかと思います。

これで同じようにパフォーマンスが低下しますか?

select * from zipcode_distances where zipcode_from='92101' and distance < 10;

もう1つの問題は、タイミングをどのように行っているかです。キャッシュがいっぱいになることによる影響を避けるために、複数回実行する必要があります。

于 2012-12-30T18:31:08.623 に答える