优化大搜索 MySQL table

Optimizing searches for big MySQL table

我正在使用 MariaDB (MySQL) table,它主要包含有关全世界城市的信息,它们的 latitude/longitude 和所在国家/地区代码(2 个字符)城市群岛table 太大了,超过 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,而不是 INSERTSUPDATES(它们总是相同的信息)。

我认为我应该:

  1. 创建一个索引(按城市?按城市和国家?)
  2. 创建分区(按国家/地区?)

我应该同时完成这两项任务吗?如果是这样……我该怎么做?谁能给我几个建议?我有点迷路了。

PS。我试过这个来按城市和国家创建和索引(我不知道我是否做得很好......):

CREATE INDEX idx_cities ON Cities(city (30), country (2));

使用"prefix indexing"。只需使用 INDEX(city, country) 这对以下任何一个都非常有效:

WHERE city = 'London'   -- 26 results, half in the US
WHERE city = 'London' AND country = 'CA'  -- one result

使用分区。 table 太小,没有性能优势。

因为只有250万行,使用id MEDIUMINT UNSIGNED节省2.5MB。

您还有什么疑问?如果你需要"find the 10 nearest cities to a given lat/lng",那么请看this

您的 table,包括索引,可能只有 300MB。