2015-09-29 3 views
0

У меня есть таблица базы данных с zipcodes, часовыми поясами, широтой, долготой и некоторыми другими данными о местоположении, охватывающими весь мир. В таблице 8,379,070 строк. Вероятно, более половины ГБ данных. Таблица называется timezones.Простой запрос MySQL в относительно большой таблице работает очень медленно

При попытке выполнить запрос, чтобы получить все записи, которые имеют почтовый индекс «90210», как это: select * from timezones where postcode = 90210; запрос возвращает 28 строки, но только после того, как 7.73 секунд.

Я попытался добавить автоматически увеличивающееся первичное ключевое целое поле и индексировать таблицу по полю почтового индекса, но ничего не помогает.

На этой скорости таблица не будет использоваться. Предполагалось, что он будет использоваться для получения предложений об автоматическом заполнении поля zipcode в форме на веб-сайте.

Есть ли способ, которым я мог бы сделать это быстрее?


Это мое описание таблицы:

+-----------+-------------+------+-----+---------+----------------+ | 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)

+1

@Mihai вы имеете в виду столбцы (возвращено 28 строк) – James

+0

Неясно, есть ли у вас индекс на почтовом индексе или нет. – e4c5

+0

I'm [email protected]Если действительно есть индекс в почтовом индексе, он должен работать намного быстрее даже с 8 миллионами строк при этой передаче данных. Может ли показать определение таблицы? – Mihai

ответ

4

Держите индекс на postcode:

create index idx_timezones_postcode on timezones(postcode); 

Затем, убедитесь, что ваши типы корректны при написании запроса:

select tz.* 
from timezones tz 
where tz.postcode = '90210'; 

Преобразование типа может предотвратить использование индекса.

+0

Дайте этому человеку пиво! –

Смежные вопросы