Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как оптимизировать запрос ? 
:(
    Опции темы
admsasha
Дата 4.8.2011, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: нет
Всего: 6



есть таблица reports, структура примерно такая
id int(11) | date int(11) | login varchar(50) | money double(10,2)| 

В ней 9 млн записей, нужно узнать какая была последняя сумма у конкретного login до определенного времени

т.е. делаю так
Код

SELECT t.login, t.money2
FROM reports t
INNER JOIN (
SELECT login, max( date1 ) dt, max( id ) rid
FROM reports
WHERE date1 <=1312120799
GROUP BY login
)s ON t.login = s.login
AND t.id = s.rid


Всё работает, но с добавлением записей всё дольше и дольше отрабатывает. Как можно оптимизировать запрос ?

explain говорит

Код

+----+-------------+----------------------+--------+---------------+---------+---------+-------+---------+----------------------------------------------+
| id | select_type | table                | type   | possible_keys | key     | key_len | ref   | rows    | Extra                                        |
+----+-------------+----------------------+--------+---------------+---------+---------+-------+---------+----------------------------------------------+
|  1 | PRIMARY     | <derived2>           | ALL    | NULL          | NULL    | NULL    | NULL  |    4876 |                                              |
|  1 | PRIMARY     | t                    | eq_ref | PRIMARY,login | PRIMARY | 4       | s.rid |       1 | Using where                                  |
|  2 | DERIVED     | reports              | ALL    | NULL          | NULL    | NULL    | NULL  | 9133086 | Using where; Using temporary; Using filesort |
+----+-------------+----------------------+--------+---------------+---------+---------+-------+---------+----------------------------------------------+
3 rows in set (30.27 sec)


Пробывал создавать индекс login+date, эффекту не дало.
Mysql: 5.1.34, тип базы MyISAM

Что  можно придумать ?


PM MAIL WWW ICQ Jabber   Вверх
Akina
Дата 4.8.2011, 09:59 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(admsasha @  4.8.2011,  10:07 Найти цитируемый пост)
у конкретного login 

Не вижу отбора КОНКРЕТНОГО логина - в выборку тащутся все.

Цитата(admsasha @  4.8.2011,  10:07 Найти цитируемый пост)
нужно узнать какая была последняя сумма у конкретного login до определенного времени

Код

where `login` = :login
and `date` <= :date
order by `date` desc
limit 1



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
admsasha
Дата 4.8.2011, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: нет
Всего: 6



Неправильно поставил задачу. Нужно как раз все )
login1 - summa1
login2 - summa2

PM MAIL WWW ICQ Jabber   Вверх
Akina
Дата 4.8.2011, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Классическая задача выбора последней записи в группе... 
http://www.sql.ru/forum/actualthread.aspx?tid=687908


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
admsasha
Дата 7.8.2011, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: нет
Всего: 6



Akina,  Никак не получается. Точнее получается, если бы поле date было уникально. Оно может быть одинаково, а нужно вывести именно последнюю строчку (ориентируясь по id). Прошу подсказать запрос.
PM MAIL WWW ICQ Jabber   Вверх
Akina
Дата 7.8.2011, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



А какая разница, max(date) или max(id)???


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
admsasha
Дата 7.8.2011, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: нет
Всего: 6



Цитата(Akina @  8.8.2011,  00:14 Найти цитируемый пост)
А какая разница, max(date) или max(id)???

Дата может быть одинакова до секунды, ID нет. Или я не понял вопроса ? 

А в выборке, я не пойму в чем разница, может в индексах... Не могу сообразить  smile

Добавлено через 14 минут и 24 секунды
Т.е. если я пишу так, то запрос выполняется за 0.45 секунд....
Код

SELECT t.login, t.money2
FROM reports t
INNER JOIN (
SELECT login, max( date1 ) dt
FROM reports
WHERE date1 <=1312120799
GROUP BY login
)s ON t.login = s.login
AND t.date1 = s.dt


PM MAIL WWW ICQ Jabber   Вверх
admsasha
Дата 19.8.2011, 04:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: нет
Всего: 6



В качестве эксперемента создал вот такой индекс
ALTER TABLE `reports` ADD INDEX `login_date1_id` (`login`, `date1`,`id`);

Время обработки сократилось на 5 секунд....
PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0492 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.