![]() |
Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
Добрый день
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 в составной запрос?
Неактивен

possible_keys - это список ключей, из которых оптимизатор пытается выбрать ключ для
выполнения конкретного запроса.
Что значит "включить primary key в составной запрос"?
P.S. Лучше избегать стиля написания вида "ON (... AND ...)" - смысла в именно такой записи
не особо много, а читается запрос гораздо сложнее. js.Visible=1 самое место в WHERE.
Неактивен
Что значит "включить primary key в составной запрос"?
Это я глупость ляпнул, извините ![]()
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. И чем он будет меньше, тем лучше
Поэтому, ИМХО, как раз писать так, как я, потому что читается так: "объедени таблицу А с записями из Б, которые param=value", а а Вашем случае запрос читается как: объедини таблицы А и Б и из объединения выбери элементы param=value".
Отредактированно Magz (13.01.2009 18:41:19)
Неактивен

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