SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 30.10.2011 22:06:19

rbwest
Участник
Зарегистрирован: 30.10.2011
Сообщений: 19

Подскажите, этот запрос написан правильно?

Всем здравствуйте. Делаю запрос, он объединяет в себе выборку из 3 таблиц
table1 - основная таблица, в которой хранятся все данные об объектах каталога
table2 - таблица со списком областей
table3 - таблица со списком городов

как видно, я в запросе сравниваю id области и id города с такими же полями в таблицах 2 и 3

$query = "SELECT SQL_CACHE SQL_CALC_FOUND_ROWS t1.id_pkv, t1.date_pkv, t1.time_pkv, t1.id_razdel, t1.id_rubpkv, t1.id_city, t1.street_pkv, t1.obpl_pkv, t1.zilpl_pkv, t1.citpl_pkv, t1.komn_pkv, t2.name_oblast, t3.name_city FROM table1 t1
          
           LEFT JOIN table2 t2 ON t1.id_oblast=t2.id_oblast
           LEFT JOIN table3 t3 ON t1.id_city=t3.id_city   
      
           WHERE t1.id_razdel=1 AND t1.id_rubpkv=2 AND t1.id_oblast=3 AND t1.id_city=4 $order LIMIT $offset, $perPageSearch";

Запрос работает, пока на больших объемах данных не проверял, но.. хотелось бы узнать, запрос написан нормально или можно его как то оптимизировать?
Понятно, что пока работает лучше не трогать, но я просто не очень силен в MySql, поэтому интересуюсь - вдруг я чтото изначально неправильно сделал.
Заранее спасибо!

Отредактированно rbwest (30.10.2011 22:07:03)

Неактивен

 

#2 30.10.2011 22:15:03

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 848

Re: Подскажите, этот запрос написан правильно?

Если позволяет логика (т.е. для всякой строки точно есть записи в таблицах городов и областей) - сделайте простой JOIN, а не LEFT. Будет побыстрее.
Должны обязательно быть индексы на t1.id_oblast и t1.id_city.
В остальном вроде нормально.

Неактивен

 

#3 30.10.2011 22:21:14

rbwest
Участник
Зарегистрирован: 30.10.2011
Сообщений: 19

Re: Подскажите, этот запрос написан правильно?

Да, строки область и город есть обязательно, а как узнать индексные они или нет? в дампе базы для этих таблиц вот такая запись
для области
PRIMARY KEY  (`id_oblast`)
для города
PRIMARY KEY  (`id_city`)

Это и есть индексы?

Неактивен

 

#4 31.10.2011 14:13:17

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2420

Re: Подскажите, этот запрос написан правильно?

LazY написал:

Если позволяет логика (т.е. для всякой строки точно есть записи в таблицах городов и областей) - сделайте простой JOIN, а не LEFT. Будет побыстрее.
Должны обязательно быть индексы на t1.id_oblast и t1.id_city.
В остальном вроде нормально.

А если исходить из текущей схемы (с LEFT JOIN'ами), то нужны индексы на t2.id_oblast, t3.id_city и составной индекс на комбинацию полей (id_razdel,id_rubpkv,id_oblast,id_city).

rbwest написал:

Да, строки область и город есть обязательно, а как узнать индексные они или нет? в дампе базы для этих таблиц вот такая запись
для области
PRIMARY KEY  (`id_oblast`)
для города
PRIMARY KEY  (`id_city`)

Это и есть индексы?

Да, первичный ключ (в отличии от вторичного) включает в себя индекс по полю. А вообще индексы на конкретные поля и комбинации полей можно посмотреть хотя бы с помощью

show create table table1
после перечисления полей будут перечислены индексы.

Отредактированно deadka (31.10.2011 14:13:50)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 31.10.2011 14:15:37

rbwest
Участник
Зарегистрирован: 30.10.2011
Сообщений: 19

Re: Подскажите, этот запрос написан правильно?

Огромное спасибо ответившим, разобрался!

Неактивен

 

Board footer

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