[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Выборка из 70 миллионной таблицы
web-monster
Привет! Вообщем делаю запрос на выборку трафика из биллинга, в таблице 70 миллионов записей, индексы идут по полям account_id и discount_date_month в таблице discount_transactions_iptraffic_all (собственно там и есть 70 миллионов записей)
Сделал такой запрос:

SELECT t1. * , t2.account_id, t2.t_class, t4.value, t3.login, t3.full_name, t3.actual_address, 
t3.home_telephone, t3.mobile_telephone
FROM service_links t1
INNER JOIN discount_transactions_iptraffic_all t2 ON t2.account_id = t1.account_id
AND t2.discount_date_month >= '1270065600'
AND t2.discount_date_month <= '1272657600'
AND t2.t_class = '10'
INNER JOIN users t3 ON t1.account_id = t3.id
INNER JOIN user_additional_params t4 ON t1.account_id = t4.userid
AND t4.paramid = '1'
WHERE t1.service_id = '175'
AND t1.is_deleted != '1'
GROUP BY t2.account_id


выполняется он ооочень долго, когда делаю explain вижу что на условие WHERE t1.service_id = '175' он не реагирует, если меняешь значение то он также выбирает 2миллиона записей, а должен по идеи смотреть только тех пользователей у которых тариф 175, в промежутке между такой-то датой discount_date_month. Пользователи у которых такой тариф сравниваются t2.account_id = t1.account_id и выводится результат. Но не работает, помогите что не так я сделал что он не реагирует на условия, может как-то подругому надо переставить?



Спустя 28 минут, 43 секунды (17.05.2010 - 12:39) Nikitian написал(а):
Попробуйте так:

SELECT t1. * , t2.account_id, t2.t_class, t4.value, t3.login, t3.full_name, t3.actual_address,
t3.home_telephone, t3.mobile_telephone
FROM service_links t1
INNER JOIN discount_transactions_iptraffic_all t2 ON t2.account_id = t1.account_id
AND t2.discount_date_month >= '1270065600'
AND t2.discount_date_month <= '1272657600'
AND t1.service_id = '175'
AND t1.is_deleted != '1'
AND t2.t_class = '10'
INNER JOIN users t3 ON t1.account_id = t3.id
INNER JOIN user_additional_params t4 ON t1.account_id = t4.userid
AND t4.paramid = '1'
GROUP BY t2.account_id

Хотя не факт, что получится. Вероятно здесь лучше разбить ваш запрос на 3-4 простых.

Результат explain вашего и моего вариантов покажите, чтобы понять куда копать.

Спустя 2 часа, 32 секунды (17.05.2010 - 14:40) web-monster написал(а):
Вот мой результат:

Спустя 1 минута, 44 секунды (17.05.2010 - 14:42) web-monster написал(а):
Ваш вариант:

Спустя 1 минута, 12 секунд (17.05.2010 - 14:43) web-monster написал(а):
t2 2 миллиона записей, причём если менять service_id = '175' на другой тариф 222 к примеру то такое же кол-во записей и остаётся.

Спустя 6 минут, 19 секунд (17.05.2010 - 14:49) Семён написал(а):
Просто ради интереса:
---
База данных на отдельном компьютере вертится? И нагрузка ложится полностью на её плечи без вспомогательных средств?

Спустя 12 минут, 44 секунды (17.05.2010 - 15:02) Nikitian написал(а):
Из какой таблицы выбирается меньше всего записей? Вообще подбивку бы по количеству полезных записей в каждой таблице.

Спустя 2 часа, 21 минута, 21 секунда (17.05.2010 - 17:23) web-monster написал(а):
база на отдельном сервере крутится, меньше всего выбирается в t1

Спустя 23 минуты, 12 секунд (17.05.2010 - 17:46) Nikitian написал(а):
Разбивайте запрос на части и делайте запросы отдельно, начиная с самого подробного, чтобы в дальнейшем выбиралось как можно меньше записей. При объединении будут геометрически расти общий объём выбираемой информации.
Можно поизвращаться с подзапросами, должно чуть лучше получиться. Помог бы, но заболел и мозг вынесло окончательно, совсем ничего не соображаю (:

Спустя 21 час, 27 минут, 59 секунд (18.05.2010 - 15:14) vagrand написал(а):
В первую очередь в эксплейне вам нужно избавится от двух вещей using temporary и using filesort. Происходит это из-за group by, при этом в базе создается временная таблица в которую загоняются сгруппированные данные, что ОЧЕНЬ долго. Подумайте как Вы можете избавится от group by. Возможно имеет смысл менять структуры БД.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.