我正在使用MariaDB(MySQL)表,该表主要包含有关全球城市,其纬度/经度以及城市所在国家/地区代码(2个字符)的信息。表格是如此之大,超过250万行。
show columns from Cities;
+---------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| city | varchar(255) | YES | | NULL | |
| lat | float | NO | | NULL | |
| lon | float | NO | | NULL | |
| country | varchar(255) | YES | | NULL | |
+---------+--------------+------+-----+---------+----------------+
我想实现一个城市搜索者,因此我必须优化SELECTS
,而不是INSERTS
或UPDATES
(它将始终是相同的信息)。
我认为我应该:
我应该同时执行两项任务吗?如果是这样,我该怎么办?有人可以给我一些建议吗?我有点迷路了。
PS。我尝试使用此方法来按城市和国家/地区创建索引(我不知道自己做得是否好...):
CREATE INDEX idx_cities ON Cities(city (30), country (2));
答案 0 :(得分:1)
不要不使用“前缀索引”。只需使用INDEX(city, country)
即可很好地满足以下任一条件:
WHERE city = 'London' -- 26 results, half in the US
WHERE city = 'London' AND country = 'CA' -- one result
不要不使用分区。该表太小,没有任何性能优势。
由于只有250万行,请使用id MEDIUMINT UNSIGNED
保存2.5MB。
您还有其他疑问吗?如果您需要“为给定的经纬度查找10个最近的城市”,请参阅this。
您的表(包括索引)可能只有300MB。