我正在使用geonames.org的地理空间数据库。我目前在我的网站上有一个自动完成输入字段,它将搜索词转发到数据库并返回适当的结果。一件重要的事情是,结果必须按国家/地区排序。
我从中选择的表大约有 900.000 行,并使用以下命令创建:
CREATE TABLE IF NOT EXISTS `geonames` (
`id` integer NOT NULL AUTO_INCREMENT PRIMARY KEY,
`country_code` char(2) NOT NULL,
`postal_code` varchar(20) NOT NULL,
`place_name` varchar(180) NOT NULL,
...
FULLTEXT(country_code),
FULLTEXT(postal_code),
FULLTEXT(place_name)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
一个典型的语句如下所示:
SELECT postal_code, place_name FROM geonames WHERE LOWER(`place_name`)
LIKE 'washin%' ORDER BY FIELD (country_code, 'JE', 'GB', 'FR', 'LI', 'CH',
'DK', 'LU', 'BE', 'NL', ... many more countries in that list ... ) DESC;
我使用FULLTEXT索引来加速WHERE place_name LIKE 'washin%'
零件。但是查询仍然有些慢。SQL 查询的任务是在表中搜索每个place_name
匹配的'washin%'
,然后根据指定的国家对结果进行排序。查询速度慢是不是因为一次请求的数据量大?如果是的话,我怎么能减少这个瓶颈的运行时间?
我无论如何都不是 MySQL 方面的专家,所以如果有经验丰富的人可以帮助我加快显示的 SQL 查询或至少为我指明优化的方向,我会很高兴。
非常感谢你!