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