优化大型MySQL表的搜索

时间:2019-08-01 12:26:51

标签: mysql optimization indexing partitioning database-partitioning

我正在使用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,而不是INSERTSUPDATES(它将始终是相同的信息)。

我认为我应该:

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

我应该同时执行两项任务吗?如果是这样,我该怎么办?有人可以给我一些建议吗?我有点迷路了。

PS。我尝试使用此方法来按城市和国家/地区创建索引(我不知道自己做得是否好...):

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

1 个答案:

答案 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。