Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 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