Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: более 7 000 000

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Как бы это прокумекать?
DeepVarvar Супермодератор
Отправлено: 27 Сентября, 2011 - 14:20:02
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Есть табулечка, и в ней более 7 000 000 записей.
Годами накапливалось. Теперь уж ничего не поделаешь.
Но как бы ее оптимизировать.
Данные из нее беруться демоном в другую таблицу.
Но до жути долго идет выборка по интервалам дат.
На 4 результата 3-7 минут.

Что-то хоть сделать можно чтобы быстрее было или пусть хряпает так?
 
 Top
Мелкий Супермодератор
Отправлено: 27 Сентября, 2011 - 14:26:50
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




DeepVarvar пишет:
Но до жути долго идет выборка по интервалам дат.

Индекс есть по полю? По explain'у используется?


-----
PostgreSQL DBA
 
 Top
EuGen Администратор
Отправлено: 27 Сентября, 2011 - 14:30:22
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




0. Определить интервал дат, актуальных для выборки. Все, что более раннее - отправить в архивную таблицу и в случае запросов к ним объединять ее с той, в которой останутся остальные. Например, за последний месяц
1. Дискретизировать дату - например, хранить отдельно год, месяц, день - и создать индексы в соответствии с тем, как идет выборка. Не поможет, если нужны точные данные (до секунды скажем), но поможет, если требуется агрегация помесячно, по дням и т.п.
2. Применить OPTIMIZE если у Вас InnoDB


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
MrBeard
Отправлено: 27 Сентября, 2011 - 14:31:26
Post Id



Гость


Покинул форум
Сообщений всего: 97
Дата рег-ции: Авг. 2011  


Помог: 2 раз(а)





с грустью посмотрел на свою архивную таблицу с 1.700.000.000 строк и подумал - мне бы ваши проблемы


без структуры и explain трудно о чём то говорить) и без запроса непосредственного
(Добавление)
ещё по запросам интервала дат, видел как то статью про оптимизацию between - http://habrahabr[dot]ru/blogs/mysql/125467/

(Отредактировано автором: 27 Сентября, 2011 - 14:43:12)

 
 Top
DeepVarvar Супермодератор
Отправлено: 27 Сентября, 2011 - 17:48:44
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




EuGen пишет:
Определить интервал дат, актуальных для выборки
Все..
Мелкий пишет:
Индекс есть по полю?
По всем нужным есть..
Мелкий пишет:
explain
Нет, одна таблица, выборка только по условию (id) и периоду в 30 дней, не важно сколько их в месяце. Период может "засекать" и "полумесяцы".
Выборка начинается с даты за которую было большее кол-во "событий".
MrBeard пишет:
свою архивную таблицу

Моя не архивная.
---
Сначала джойнил - но ждать по 40 мин результата не интересно.
Индексы были изначально.

Сейчас так:
Один запрос выбирает три самых "событийных" даты для одного "исполнителя":
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT adate,cevent,author FROM tbl ORDER BY cevent DESC LIMIT 3

все очень быстро..

Второй запрос тащит из той же таблицы даты (+15 и - 15 дней) и cevent (кол-во событий)..
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT adate,cevent FROM tbl WHERE author = 'author1'
  2. AND adate >= '2009-12-16' AND adate <= '2010-01-15'
  3. /*GROUP BY adate (груп бай роли не играет)*/

Надо строить график..
 
 Top
Мелкий Супермодератор
Отправлено: 27 Сентября, 2011 - 18:08:19
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Explain наш друг, он много полезного говорит.

DeepVarvar пишет:
author = 'author1'
AND adate >= '2009-12-16' AND adate <= '2010-01-15'

Имеет смысл построить индекс по author & adate


-----
PostgreSQL DBA
 
 Top
DeepVarvar Супермодератор
Отправлено: 27 Сентября, 2011 - 22:16:38
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Мелкий пишет:
построить индекс по author & adate

DeepVarvar пишет:
Индексы были изначально.
 
 Top
Мелкий Супермодератор
Отправлено: 27 Сентября, 2011 - 22:31:21
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




DeepVarvar, по всем возможным комбинациям полей, что ль? Тогда дропни лишние.


-----
PostgreSQL DBA
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB