相对较大 table 中的简单 MySQL 查询运行速度非常慢
Simple MySQL query in a relatively large table runs very slow
我有一个数据库 table,其中包含邮政编码、时区、纬度、经度和一些覆盖整个世界的其他位置数据。 table 中有 8,379,070 行。可能超过一半 GB 的数据。 table 称为 timezones
。
当我尝试 运行 查询以获取邮政编码为“90210”的所有记录时,如下所示:
select * from timezones where postcode = 90210;
查询 returns 28
行,但仅在 7.73
秒后。
我尝试添加一个自动递增的主键整数字段,并通过邮政编码字段索引 table,但没有任何帮助。
在这个速度下,table 将无法使用。它应该用于检索网站表单中自动完成邮政编码字段的建议。
有什么方法可以让这个 运行 更快?
这是我的table描述:
+-----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+----------------+
| country | varchar(45) | YES | | NULL | |
| region1 | varchar(45) | YES | | NULL | |
| region2 | varchar(45) | YES | | NULL | |
| region3 | varchar(45) | YES | | NULL | |
| locality | varchar(45) | YES | | NULL | |
| postcode | varchar(45) | YES | MUL | NULL | |
| latitude | varchar(45) | YES | | NULL | |
| longitude | varchar(45) | YES | | NULL | |
| timezone | varchar(45) | YES | | NULL | |
| utc | varchar(45) | YES | | NULL | |
| dst | varchar(45) | YES | | NULL | |
| idx | int(11) | NO | PRI | NULL | auto_increment |
+-----------+-------------+------+-----+---------+----------------+
12 rows in set (0.00 sec)
保持索引 postcode
:
create index idx_timezones_postcode on timezones(postcode);
然后,请确保您在编写查询时的类型是正确的:
select tz.*
from timezones tz
where tz.postcode = '90210';
类型转换可以防止索引的使用。
我有一个数据库 table,其中包含邮政编码、时区、纬度、经度和一些覆盖整个世界的其他位置数据。 table 中有 8,379,070 行。可能超过一半 GB 的数据。 table 称为 timezones
。
当我尝试 运行 查询以获取邮政编码为“90210”的所有记录时,如下所示:
select * from timezones where postcode = 90210;
查询 returns 28
行,但仅在 7.73
秒后。
我尝试添加一个自动递增的主键整数字段,并通过邮政编码字段索引 table,但没有任何帮助。
在这个速度下,table 将无法使用。它应该用于检索网站表单中自动完成邮政编码字段的建议。
有什么方法可以让这个 运行 更快?
这是我的table描述:
+-----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+----------------+
| country | varchar(45) | YES | | NULL | |
| region1 | varchar(45) | YES | | NULL | |
| region2 | varchar(45) | YES | | NULL | |
| region3 | varchar(45) | YES | | NULL | |
| locality | varchar(45) | YES | | NULL | |
| postcode | varchar(45) | YES | MUL | NULL | |
| latitude | varchar(45) | YES | | NULL | |
| longitude | varchar(45) | YES | | NULL | |
| timezone | varchar(45) | YES | | NULL | |
| utc | varchar(45) | YES | | NULL | |
| dst | varchar(45) | YES | | NULL | |
| idx | int(11) | NO | PRI | NULL | auto_increment |
+-----------+-------------+------+-----+---------+----------------+
12 rows in set (0.00 sec)
保持索引 postcode
:
create index idx_timezones_postcode on timezones(postcode);
然后,请确保您在编写查询时的类型是正确的:
select tz.*
from timezones tz
where tz.postcode = '90210';
类型转换可以防止索引的使用。