Задавайте вопросы, мы ответим
Вы не зашли.
Не знаю с чего начать, поэтому спрошу так:
есть запрос:
Неактивен
О ужас Скорее всего, этому запросу уже ничто не поможет.
Попробуйте разбить его на осмысленные куски через UNION.
Если вот эти много-много условий обычно выполняются, то может
оказаться удобным выбирать сразу по дате, а потом проверять
уже соответствие остальным индексам. Т.е. что-то типа
SELECT t.*
FROM zbl_content co
JOIN ( страшный запрос ) t ON t.id = co.id
ORDER BY co.pubdate DESC
LIMIT 3
Если условия выполняются не почти всегда, сделает хуже.
Кстати, а почему таблицы называются, начиная с решетки?
Неактивен
paulus написал:
Попробуйте разбить его на осмысленные куски через UNION.
я не очень понял чт Вы имели ввиду(((
я пробовал делать общий индекс (имя - pubdate) на то, что участвует в WHERE
published
showlatest
user_id
is_end
enddate
pubdate
category_id
таблицы zbl_content, количество rows уменьшилось, но
| 1 | SIMPLE | con | ref | pubdate | pubdate | 8 | const,const | 8 | Using where; Using temporary; Using filesort |
paulus написал:
Кстати, а почему таблицы называются, начиная с решетки?
даже сам хз почему так скопипастилось - естественно решеток нет в начале названия.
Неактивен
Добавление индекса не спасет — у Вас там сложная логика с OR посередине.
Если избавиться от OR (например, разбить на два независимых запроса), то
можно выискивать уже индексы, но, скорее всего, они в этом случае все равно
останутся малоэффективными.
Неактивен
Спасибо за ответы. Просто мне не очень понятна логика построения индексов и я хотел на примере ее понять, видимо не очень удачный запрос выбрал.
Если не сложно, то поясните на примере вот этого запроса:
Неактивен
По поводу первого вопроса:
если из запроса убрать DISTINCT, а индексы сделать - общий индекс на published, showlatest, pubdate
Отредактированно fuze (01.02.2010 14:44:33)
Неактивен
При чтении таблицы используется максимум один индекс (есть некоторые исключения,
но их сложно использовать). Соответственно, нужно стараться делать так, чтобы запрос
максимально укладывался в индекс. В Вашем случае нужен один из индексов на con
(published, NSLeft), (published, NSRight), (NSLeft), (NSRight) — в зависимости от cardinality
published и количества выбираемых строк по NS*.
Также основным правилом при выборе индексов и построении запросов является исполь-
зование головы в каждом случае, а не тупой перебор индексов
--
Работает так, как Вам нужно, — значит, корректно.
Неактивен
paulus, спасибо за ответы.
Неактивен