我已经拿了一个邮政编码数据库并预先计算了到某个半径范围内其他邮政编码的距离。数据库本身大约是2.5GB,所以没什么特别的。
这样做的目的是:
select * from zipcode_distances where zipcode_from=92101 and distance < 10;
到目前为止,我定义的唯一指标是:
(zipcode_from, distance)
但是,运行查询大约需要20秒才能获得结果。
当我删除“and distance < 10
”子句时,结果是即时的。
任何建议都将受到赞赏。
编辑:
这是create语句:
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, 过滤,额外1,SIMPLE,zipcode_distances,ALL, idx_zip_from_distance,null,null,null,62548720,100.00,使用位置
谢谢!
答案 0 :(得分:3)
我发现MySQL使用查询索引没有问题。我想知道92101的类型转换是否会让人感到困惑。
你对此有不同的表现吗?
select * from zipcode_distances where zipcode_from='92101' and distance < 10;
另一个问题是你如何做时间。您必须多次运行才能避免填充缓存的影响。