Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте все! Прошу помсощи, т.к. не могу понять в чем дело.
Имеется база, таблицы в которой создаются следующими запросами:
CREATE TABLE `country` (
`id` mediumint(8) unsigned NOT NULL auto_increment,
`country` varchar(255) NOT NULL default '',
`countrycode` mediumint(9) NOT NULL default '0',
PRIMARY KEY (`id`)
);
CREATE TABLE `country_region` (
`id_country` mediumint(8) NOT NULL default '0',
`id_region` mediumint(8) NOT NULL default '0'
);
CREATE TABLE `region_city` (
`id_region` mediumint(8) NOT NULL default '0',
`id_city` mediumint(8) NOT NULL default '0'
);
CREATE TABLE `region` (
`id` mediumint(8) NOT NULL auto_increment,
`region` varchar(255) NOT NULL default '',
PRIMARY KEY (`id`)
);
CREATE TABLE `city` (
`id` mediumint(9) NOT NULL auto_increment,
`city` varchar(255) NOT NULL default '',
`telcode` varchar(6) NOT NULL default '0',
`timezone` int(2) NOT NULL default '0',
PRIMARY KEY (`id`)
);
Имеются 2 запроса:
1) select * from region where id in (select id_region from country_region where id_country=(select id from country where country='Россия')) - "Россия" поставлена для примера, вообще страна берется из Edit'a
2) select * from city where id in (select id_city from region_city where id_region=(select id from region where region='Московская область')) -
"Московская область" также приведена для примера.
Первый запрос работает отлично, при выполнении же второго - зависает компьютер.
Помогите разобраться. Заранеее спасибо
Неактивен
«Зависает компьютер» — это плохо. Запросы тут, конечно, не при чем. Смотрите, что
с оборудованием и програмным обеспечением. Проверьте память и диск.
Неактивен
Дело в том, что подобные подзапросы MySQL считает зависимыми, т.е. выполняет для каждой строки.
Разница приведенных запросов заключается в разном размере таблиц, отсюда и такой результат.
Неактивен
paulus написал:
«Зависает компьютер» — это плохо. Запросы тут, конечно, не при чем. Смотрите, что
с оборудованием и програмным обеспечением. Проверьте память и диск.
Спасибо за совет, но с оборудованием и ПО все отлично. Так почему же тогда работает первый запрос и не работает второй?
Неактивен
vasya написал:
Дело в том, что подобные подзапросы MySQL считает зависимыми, т.е. выполняет для каждой строки.
Разница приведенных запросов заключается в разном размере таблиц, отсюда и такой результат.
Спасибо, а как мне решить то проблему?
Неактивен
Запрос работает, просто он использует гораздо больше ресурсов, чем
первый (см ответ Василия почему). А виснет компьютер потому, что из-за
большого потребления ресурсов с ним что-то происходит (перегревается,
уходит в файл подкачки, что-то еще).
Неактивен
Спасибо, ну а как мне обеспечить быстрый поиск города по региону? Есть какой-то другой вариант запроса, или его можно как-то оптимизировать.
Н.-р: select city from city where id in (select id_city from region_city inner join region on region_city.id_region=region.id where region.region='Московская область') ?
У кого есть какие-то варианты, подскажите пожалуйста.
А как организован такой поиск, скажем, при регистрации аккаунтов на страничках некоторых сайтов? Помогите разобраться, буду рад любому совету.
Неактивен
И кстати, проверял на компьютере с большей производительностью - он не виснет, а просто долго считает. Так что, повторюсь, нужно как-то повысить быстродействие запроса
Неактивен
А это уже не изначальная проблема
1. Оптимизируйте структуру. Город всегда принадлежит одному (и только одному) региону.
Поэтому нет смысла в таблице region_city: достаточно поля region в табличке city.
2. Добавьте индексы в таблицах по нужным полям:
region(region), city(region)
3. Перепишите запрос через объединение:
SELECT c.city
FROM city c JOIN region r ON (c.region = r.id)
WHERE r.region = 'Московская область';
Неактивен