[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Плдсмкажите как оптимизировать запрос
Basili4
Есть у меня таблица

Объект, индекс , инфа
индекс это счетчик для конкретного объекта

мне надо вытянуть все записи

с максимальным индексом для объекта


пока сделал так

select *  FROM history 
WHERE `Index` in (SELECT
MAX(`Index`)
FROM
history
GROUP BY
history.Sn)



но это очень долго

Кто нибудь подскажет как это можно оптимизировать











Спустя 32 минуты, 28 секунд (15.11.2010 - 18:29) Nikitian написал(а):
select *  FROM history order by `Index` desc limit 1

Спустя 1 минута, 51 секунда (15.11.2010 - 18:30) Basili4 написал(а):
Nikitian
мне нужны все sn с максимальными index

Спустя 2 минуты, 47 секунд (15.11.2010 - 18:33) Nikitian написал(а):

select sn from history where `Index`=(select `Index` FROM history order by `Index` desc limit 1)

Спустя 3 минуты, 2 секунды (15.11.2010 - 18:36) Basili4 написал(а):
Nikitian
так выбирает только 1 sn с самым большим индексом а мне надо все 1 запись sad.gif

Спустя 3 минуты, 23 секунды (15.11.2010 - 18:40) Nikitian написал(а):
Протупил, не заметил group в вашем запросе. Вроде уж дальше некуда, вполне корректный запрос. Индексы проставьте, проанализируйте explain...

Спустя 4 минуты, 35 секунд (15.11.2010 - 18:44) Basili4 написал(а):
Nikitian
долго очень 100 000 записей минут 20 выбирает. sad.gif ладно буду еще думать

Спустя 35 минут, 29 секунд (15.11.2010 - 19:20) Nikitian написал(а):
Используйте диапазоны, чтобы выбирать не все history.Sn, а по частям. Если у вас результат запроса 100к записей, то не удивительно, что долго (:

Спустя 1 час, 37 минут, 51 секунда (15.11.2010 - 20:57) vagrand написал(а):
Не в упрек автору, но все же. Большинство любителей подзапросов почему-то забывают или вообще не знают такого интересного момента - подзапрос выполняется для каждой строки отобранной в основном запросе. А у автора в подзапросе еще и группировка. Вот и подумайте над его скоростью.

Спустя 3 минуты, 29 секунд (15.11.2010 - 21:01) sergeiss написал(а):
Цитата (Basili4 @ 15.11.2010 - 19:30)
мне нужны все sn с максимальными index

Вот тут поподробнее... Что значит "все СН с максимальными индекс"? Максимальное может быть одно значение либо надо задавать критерий, выше которого индекс принадлежит к максимальным.

Затем. Я надеюсь, что индексы по полю Index есть?

И, учитывая ограниченность MySQL ;) в таких вопросах (запросах), предлагаю тебе сделать 2 запроса: сначала найти список этих максимальных индексов, а только потом сформировать запрос на выборку. Чтобы примерно так получилось (указываешь конкретные значения)
select *  FROM history 
WHERE `Index` in (1, 4, 467)


PS. В Постгре, кстати, можно гарантированно выполнить подзапрос только один раз. Там это так примерно будет:
WITH
subquery as (select всё_что_угодно)

SELECT * from history where index in (select * from subquery)

Спустя 17 минут, 29 секунд (15.11.2010 - 21:18) Nikitian написал(а):
Можно ещё через временные таблицы решить:

CREATE TEMPORARY TABLE tmp (`Index` INT(11) NOT NULL);
insert into `tmp` SELECT MAX(`Index`) as `Index` FROM `history` GROUP BY `history`.Sn;
select h.* FROM `history` as h, `tmp` as t WHERE h.`Index` =t.`Index`;

Да, запросов 3, но выполнится быстрее, т..к нет трансфера выборки максимальных значений от сервера бд, которых может быть и много. Да и в относительно медленном пхп не надо формировать циклом новый запрос.

vagrand
Спасибо, действительно догадывался, но не знал, что если подзапрос стоит в where, то он выполняется для каждой итерации, а если в select, то единыжды (:


_____________
Цитата
От постоянного сидения рядом с клавиатурой начинает болеть спина.


Делаю сайты, пишу скрипты php, js.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.