Оптимизация запроса

Иван_и
Дата: 18.12.2012 11:25:03
Привет! нужна помощь. Есть запрос который выполняется 16 секунд. как его оптимизировать?

SELECT *
FROM `table_name` table1
WHERE
  (SELECT COUNT(*) FROM `table_name_isset` WHERE `id_user`='256' && `id_name`=table1.id_name)=0
  && `photo`!=''
ORDER BY `point` DESC
LIMIT 20
Добрый Э - Эх
Дата: 18.12.2012 11:43:06
как минимум заменить агрегатный подзапрос на not exists, раз уж все одно проверяешь отсутствие записей в таблице...
miksoft
Дата: 18.12.2012 11:43:16
Покажите DDL обоих таблиц и план выполнения запроса.
Arhat109
Дата: 18.12.2012 11:55:59
Иван_и, например так:
SELECT t1.*
FROM `table_name` AS t1
LEFT JOIN `table_name_isset` AS t2 ON t2.`id_user`='256' && t2.`id_name`=t1.`id_name`
WHERE
  t1.`photo` != '' AND t2.`id_user` IS NULL
ORDER BY t1.`point` DESC
LIMIT 20


+ проверить наличие нужных индексов на поля t1: `id_name`, `photo` и `point`, а также поля t2: `id_user` и `id_name`

очень хорошо, если что-то из этого есть в primary key.
, также можно посмотреть на селекивность полей и возможно сделать составной индекс (смотреть по месту)...
Иван_и
Дата: 18.12.2012 12:05:46
Arhat109,

Спасибо! работает.
miksoft
Дата: 18.12.2012 12:32:48
Arhat109,

t1.`photo` != '' нужно в условие соединения перенести, насколько я понимаю.
tanglir
Дата: 18.12.2012 12:38:04
miksoft,

зачем, оно же и в оригинале в where-блоке сидит?
tanglir
Дата: 18.12.2012 12:38:50
Хотя тут без разницы, всё равно оно к левой таблице относится...
miksoft
Дата: 18.12.2012 12:43:23
Да, это я наврал, сорри.
По невнимательности решил, что относится к правой таблице.