SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 24.12.2008 16:15:55

Magz
Гуру
Откуда: Москва
Зарегистрирован: 18.09.2007
Сообщений: 112

Помогите, пожалуйста, "прочитать" Explain

Добрый день

Код:

EXPLAIN 
  SELECT count(*) Count 
  FROM journal_News jn 
    JOIN journal_news_to_sections jnts ON (jn.id = jnts.id_news) 
    JOIN journal_Sections js ON (jnts.id_section = js.id and js.Visible=1) 
WHERE jn.HideNews = '0' AND jn.ShowDate <= NOW():

*** row 1 ***
          table:  jn
           type:  ref
  possible_keys:  PRIMARY,ShowDate,HideNews
            key:  HideNews
        key_len:  2
            ref:  const
           rows:  5189
          Extra:  Using where
*** row 2 ***
          table:  jnts
           type:  ref
  possible_keys:  id_news
            key:  id_news
        key_len:  4
            ref:  db_realto3.jn.id
           rows:  4
          Extra:  Using index
*** row 3 ***
          table:  js
           type:  eq_ref
  possible_keys:  PRIMARY,Visible
            key:  PRIMARY
        key_len:  4
            ref:  db_realto3.jnts.id_section
           rows:  1
          Extra:  Using where

Как я понимаю, строка "possible_keys:  PRIMARY,ShowDate,HideNews" говорит о том, что можно использовать составной ключ. Так ли это? Если так, то как можно включить primary key в составной запрос?

Неактивен

 

#2 24.12.2008 18:10:47

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

Re: Помогите, пожалуйста, "прочитать" Explain

possible_keys - это список ключей, из которых оптимизатор пытается выбрать ключ для
выполнения конкретного запроса.

Что значит "включить primary key в составной запрос"?

P.S. Лучше избегать стиля написания вида "ON (... AND ...)" - смысла в именно такой записи
не особо много, а читается запрос гораздо сложнее. js.Visible=1 самое место в WHERE.

Неактивен

 

#3 13.01.2009 18:40:28

Magz
Гуру
Откуда: Москва
Зарегистрирован: 18.09.2007
Сообщений: 112

Re: Помогите, пожалуйста, "прочитать" Explain

Что значит "включить primary key в составной запрос"?

Это я глупость ляпнул, извините smile

P.S. Лучше избегать стиля написания вида "ON (... AND ...)" - смысла в именно такой записи
не особо много, а читается запрос гораздо сложнее. js.Visible=1 самое место в WHERE.

Если у меня в таблиц А 10 записей, в таблице B - 20 (на каждую запись в А ссылается две в В), то при объединении мы получим 20 записей. После этого по условию WHERE b.param=value мы из 20 выберем 5, которые соответствуют value. Если мы наложим уловие b.param=value в JOIN, то при объединении мы получим уже 5 записей. И если надо будет делать какие-то дополнительные условия в WHERE, то поиск будет вестить уже по 5 записям.
Я понимаю, что для простых запросов оптимизатор сам отработает как надо и разницы не будет. Однако для сложных запросов, когда идет объединение со многими таблицами и сложные ограничения в WHERE, то лучше четко знать, какой объем данных "дойдет" до WHERE. И чем он будет меньше, тем лучше smile Поэтому, ИМХО, как раз писать так, как я, потому что читается так: "объедени таблицу А с записями из Б, которые param=value", а а Вашем случае запрос читается как: объедини таблицы А и Б и из объединения выбери элементы param=value".

Отредактированно Magz (13.01.2009 18:41:19)

Неактивен

 

#4 13.01.2009 19:46:50

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

Re: Помогите, пожалуйста, "прочитать" Explain

Ну, возможно, Вам проще логически проще читать Ваш запрос. Мне лично гораздо проще, когда в JOIN написаны
лишь связи таблиц smile С точки зрения оптимизатора это полностью эквивалентные записи. Если Вы сделаете EXPLAIN
EXTENDED, то увидите, что все JOIN рассматриваются как объединение через запятую + условие в WHERE.

Неактивен

 

Board footer

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