优化大搜索 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
,而不是 INSERTS
或 UPDATES
(它们总是相同的信息)。
我认为我应该:
- 创建一个索引(按城市?按城市和国家?)
- 创建分区(按国家/地区?)
我应该同时完成这两项任务吗?如果是这样……我该怎么做?谁能给我几个建议?我有点迷路了。
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。
我正在使用 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
,而不是 INSERTS
或 UPDATES
(它们总是相同的信息)。
我认为我应该:
- 创建一个索引(按城市?按城市和国家?)
- 创建分区(按国家/地区?)
我应该同时完成这两项任务吗?如果是这样……我该怎么做?谁能给我几个建议?我有点迷路了。
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。