Mysql: Я дурак или виноват хостер?

TimeBomb
На сайте с 19.07.2005
Offline
93
577

Вкратце: перенес бд от одного хостера к другому, работать перестало.

Итак, есть бд, в ней три таблицы: "города", "регионы РФ" и таблица соответствия "город-регион". выглядит это так:

[city (города)]

id_city | citynicename | cityname

27419 Dmitrov Дмитров

27613 Domodedovo Домодедово

27626 Zhukovskij Жуковский

27602 Zelenograd Зеленоград

27514 Sheremetevo Шереметьево

27726 Jelektrostal Электросталь

27439 Jelektrougli Электроугли

27418 Jahroma Яхрома

27612 Moscow Москва

[region (регионы)]

id_region | regionname

50 Московская область

77 г. Москва

[region2city (таблица-связка)]

id_region | id_city

50 27419

50 27613

50 27626

50 27602

50 27514

50 27726

50 27439

50 27418

77 27612

далее, когда на входе появляется название города латиницей нужно выдать всю остальную инфу по нему. вот так:

Zelenograd -> 27602 Зеленоград 50 Московская область

Получившийся SELECT у меня выглядит так:

SELECT city.id_city, city.cityname, region.id_region, region.regionname FROM `city`, `region`, `region2city` WHERE city.id_city = region2city.id_city AND region.id_region = region2city.id_region AND city.citynicename = 'Zelenograd'

Это все работает, но только на тестовой базе (вот эти 9 городов что я привел в примере выше). Когда городов становится около полутора тысяч на новом хостинге (на старом все работало нормально) мускул ругается на:

#1104 - The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET SQL_MAX_JOIN_SIZE=# if the SELECT is okay

Хостер утверждает что MAX_JOIN_SIZE у него 10млн., никто никогда не жаловался, проблема на моей стороне, и предлагает оптимизировать запрос к бд. Я в свою очередь не понимаю как оптимизировать запрос который и так проще некуда. Рассудите, пожалуйста, это я не прав и запрос плох и его надо переписывать, или хостер чего-то не договаривает и нужно переезжать к другому?

[umka]
На сайте с 25.05.2008
Offline
456
#1

Возможно, EXPLAIN натолкнёт вас на какие-нибудь мысли по поводу оптимизации БД и запросов.

Лог в помощь!
maldivec
На сайте с 04.11.2008
Offline
160
#2

Переписать запрос через JOINы

и сделать индекс citynicename ...

Ну а для начала, как сказали выше, посмотреть что покажет EXPLAIN

TimeBomb
На сайте с 19.07.2005
Offline
93
#3

Спасибо! EXPLAIN очень помог!

при переносе базы от хостера к хостеру протерялись индексы.

поэтому эксплейн вначале выдавал:

table | rows

region | 89

city | 1500

region2city | 1500

Т.е. чтобы грубо оценить сколько строк должен просмотреть MySQL для выполнения запроса:

1500х1500х89 = 200250000 т.е. 200млн.🤣

после добавления индексов, на том же самом запросе получилось

table | rows

region | 89

city | 15

region2city | 1

89х15 = 1335

что в общем-то небо и земля!

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий