Объект, индекс , инфа
индекс это счетчик для конкретного объекта
мне надо вытянуть все записи
с максимальным индексом для объекта
пока сделал так
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
мне нужны все 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 запись
так выбирает только 1 sn с самым большим индексом а мне надо все 1 запись

Спустя 3 минуты, 23 секунды (15.11.2010 - 18:40) Nikitian написал(а):
Протупил, не заметил group в вашем запросе. Вроде уж дальше некуда, вполне корректный запрос. Индексы проставьте, проанализируйте explain...
Спустя 4 минуты, 35 секунд (15.11.2010 - 18:44) Basili4 написал(а):
Nikitian
долго очень 100 000 записей минут 20 выбирает.
ладно буду еще думать
долго очень 100 000 записей минут 20 выбирает.

Спустя 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 написал(а):
Можно ещё через временные таблицы решить:
Да, запросов 3, но выполнится быстрее, т..к нет трансфера выборки максимальных значений от сервера бд, которых может быть и много. Да и в относительно медленном пхп не надо формировать циклом новый запрос.
vagrand
Спасибо, действительно догадывался, но не знал, что если подзапрос стоит в where, то он выполняется для каждой итерации, а если в select, то единыжды (:
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, то единыжды (:
_____________