SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 03.08.2009 04:33:16

RadON
Участник
Зарегистрирован: 03.08.2009
Сообщений: 5

ПОМОГИТЕ ПОЖАЛУЙСТА - НЕ МОГУ РАЗОБРАТЬСЯ

Здравствуйте все! Прошу помсощи, т.к. не могу понять в чем дело.
Имеется база, таблицы в которой создаются следующими запросами:

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='Московская область'))  -
"Московская область" также приведена для примера.


Первый запрос работает отлично, при выполнении же второго - зависает компьютер.

Помогите разобраться. Заранеее спасибо


Прикрепленные файлы:
Attachment Icon База стран регионов и городов.txt, Размер: 390,402 байт, Скачано: 3,940

Неактивен

 

#2 03.08.2009 10:54:01

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: ПОМОГИТЕ ПОЖАЛУЙСТА - НЕ МОГУ РАЗОБРАТЬСЯ

«Зависает компьютер» — это плохо. Запросы тут, конечно, не при чем. Смотрите, что
с оборудованием и програмным обеспечением. Проверьте память и диск.

Неактивен

 

#3 03.08.2009 12:55:15

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: ПОМОГИТЕ ПОЖАЛУЙСТА - НЕ МОГУ РАЗОБРАТЬСЯ

Дело в том, что подобные подзапросы MySQL считает зависимыми, т.е. выполняет для каждой строки.

Разница приведенных запросов заключается в разном размере таблиц, отсюда и такой результат.

Неактивен

 

#4 04.08.2009 02:22:51

RadON
Участник
Зарегистрирован: 03.08.2009
Сообщений: 5

Re: ПОМОГИТЕ ПОЖАЛУЙСТА - НЕ МОГУ РАЗОБРАТЬСЯ

paulus написал:

«Зависает компьютер» — это плохо. Запросы тут, конечно, не при чем. Смотрите, что
с оборудованием и програмным обеспечением. Проверьте память и диск.

Спасибо за совет, но с оборудованием и ПО все отлично. Так почему же тогда работает первый запрос и не работает второй?

Неактивен

 

#5 04.08.2009 02:32:15

RadON
Участник
Зарегистрирован: 03.08.2009
Сообщений: 5

Re: ПОМОГИТЕ ПОЖАЛУЙСТА - НЕ МОГУ РАЗОБРАТЬСЯ

vasya написал:

Дело в том, что подобные подзапросы MySQL считает зависимыми, т.е. выполняет для каждой строки.

Разница приведенных запросов заключается в разном размере таблиц, отсюда и такой результат.

Спасибо, а как мне решить то проблему?

Неактивен

 

#6 04.08.2009 14:41:13

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: ПОМОГИТЕ ПОЖАЛУЙСТА - НЕ МОГУ РАЗОБРАТЬСЯ

Запрос работает, просто он использует гораздо больше ресурсов, чем
первый (см ответ Василия почему). А виснет компьютер потому, что из-за
большого потребления ресурсов с ним что-то происходит (перегревается,
уходит в файл подкачки, что-то еще).

Неактивен

 

#7 05.08.2009 03:20:45

RadON
Участник
Зарегистрирован: 03.08.2009
Сообщений: 5

Re: ПОМОГИТЕ ПОЖАЛУЙСТА - НЕ МОГУ РАЗОБРАТЬСЯ

Спасибо, ну а как мне обеспечить быстрый поиск города по региону? Есть какой-то другой вариант запроса, или его можно как-то оптимизировать.
Н.-р: 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='Московская область') ?

У кого есть какие-то варианты, подскажите пожалуйста.

А как организован такой поиск, скажем, при регистрации аккаунтов на страничках некоторых сайтов? Помогите разобраться, буду рад любому совету.

Неактивен

 

#8 05.08.2009 03:23:37

RadON
Участник
Зарегистрирован: 03.08.2009
Сообщений: 5

Re: ПОМОГИТЕ ПОЖАЛУЙСТА - НЕ МОГУ РАЗОБРАТЬСЯ

И кстати, проверял на компьютере с большей производительностью - он не виснет, а просто долго считает. Так что, повторюсь, нужно как-то повысить быстродействие запроса

Неактивен

 

#9 05.08.2009 11:44:44

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: ПОМОГИТЕ ПОЖАЛУЙСТА - НЕ МОГУ РАЗОБРАТЬСЯ

А это уже не изначальная проблема wink

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 = 'Московская область';

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson