【发布时间】:2016-01-29 22:30:41
【问题描述】:
问题:
我有一张名为 imported_cities
的大约 5000 行 表我有一张名为 postal_codes 的大约 800 000 行 表,其中包含邮政编码城市
我需要根据城市名称及其省份根据邮政编码表中的城市验证imported_cities 中的每个不同城市。请参阅下面的表格结构。
如果它们完全匹配(是的,完全匹配。其余城市是手动验证的)我必须更新imported_city上的列和 将 city from imports_cities 和 city from postal_codes(并排)输入名为 imported_cities_equiv的第三个表格 p>
我尝试过的: 向表中添加索引并在下面进行查询。 这需要永远...... :(
explain SELECT DISTINCT ic.destinationCity, pc.city FROM (imported_cities ic, postalcodes pc)
WHERE LOWER(ic.destinationCity) = LOWER(pc.city)
结果
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE ip index NULL company_city 478 NULL 4221 Using index; Using temporary
1 SIMPLE pc index NULL city_prov 160 NULL 765407 Using where; Using index; Using join buffer (Block...
--
-- 表postalcodes的表结构
CREATE TABLE IF NOT EXISTS `postalcodes` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`code` varchar(11) NOT NULL,
`city` varchar(50) NOT NULL,
`province` varchar(50) NOT NULL,
`provinceISO` varchar(2) NOT NULL,
`latitude` decimal(17,13) NOT NULL,
`longitude` decimal(17,13) NOT NULL,
PRIMARY KEY (`id`),
KEY `code` (`code`),
KEY `city_prov` (`city`,`provinceISO`)
--
-- 表imported_cities的表结构
CREATE TABLE IF NOT EXISTS `imported_cities` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`companyName` varchar(30) CHARACTER SET utf8 NOT NULL,
`destinationCity` varchar(128) CHARACTER SET utf8 NOT NULL,
`destinationProvince` varchar(20) CHARACTER SET utf8 NOT NULL,
`equivCity` varchar(128) CHARACTER SET utf8 DEFAULT NULL,
`minAmount` decimal(6,2) NOT NULL
PRIMARY KEY (`id`),
KEY `company_city` (`companyName`,`destinationCity`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=7933 ;
--
-- 表imported_cities_equiv的表结构
CREATE TABLE IF NOT EXISTS `imported_cities_equiv` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`imported_city` varchar(128) CHARACTER SET utf8 NOT NULL,
`pc_city` varchar(128) CHARACTER SET utf8 NOT NULL,
`province` varchar(20) CHARACTER SET utf8 NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=149 ;
感谢任何帮助或建议。谢谢。
【问题讨论】:
-
此外,您的查询将永远持续下去,因为它基本上是在
pc上进行表扫描,您有大约 800K 行并且它正在查看 765407,除了乘以它正在查看的ip在 4221 ...您必须添加正确的索引,加入 ON 子句以正确建立表之间的关系,和/或通过添加附加 where 子句参数来优化搜索...。