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;

另一个问题是你如何做计时。您必须运行多次以避免填充缓存的影响。

于 2012-12-30T18:31:08.623 回答