Группировка при миллионе записей

AHTIXPICT

Новичок
Группировка при миллионе записей

1,есть таблица с милионом записей
2, из этой таблы делаются разные срезы отчетов в зависимости от того по какому полю группировать
3, При группировке такого колва все равно получается достаточно много строк (например от 10строк до 500 тыс)
4, в браузер нужно выдать первые 30 например и нарисовать постраничный просмотр дальше

например

SELECT
count(*) as cnt
FROM mytbl
WHERE (1=1) /*другие условия*/
GROUP BY referer

выведет мне 500 000 строк ссумируя в эти строки колво по сгруппированому полю referer
а запрос

SELECT
count(*) as cnt
FROM mytbl
WHERE (1=1) /*другие условия*/
GROUP BY lang

выведет мне 20 строк ссумируя в эти строки колво по сгруппированому полю lang

в то же время что бы для всего этого нарисовать постраничный вывод мне нужно знать просто кол-во строк при определенной группировке.
Что бы это узнать приходится делать временную таблицу и инсерт результата такого запроса в эту темпорари таблицу
Это занимает порядка 40 секунд на хорошей железке

так вот например можно ли каким то хитрым запросом посчитать сколько получится записей (строк) при такой то (определенной) группировке, не делая саму группировку.
 

vovanium

Новичок
Возможно тебе подойдет
[sql]SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name LIMIT 5;
SELECT FOUND_ROWS();[/sql]
Первый запрос делает селект с лимитом, а второй показывает сколько строк всего было в первом селекте
 

Popoff

popoff.donetsk.ua
Если действительно очень большая таблица и постоянно приходится делать выборки с такими группировками, то можно (как вариант, если Вам не понравится SQL_CALC_FOUND_ROWS) завести отдельные таблицы, в которых сразу хранить результаты группировок и обновлять их параллельно с основной таблицей. Немного усложняется процедура редактирования (обновление, к примеру, 5 таблиц вместо одной - но это фигня по сравнению с 40 секундами, о которых Вы писали) и, может, несколько понижается глюкоустойчивость (нужно абсолютно точно знать, что все обновления в таблицу производятся внутри только одного метода, и больше нигде; обязательно нужно использовать транзакционные таблицы), но зато значительно упрощаются выборки - они сразу существуют в сгруппированном виде.
 
Сверху