2014-09-08 4 views
-1
SELECT 
    cast(t1.destination as unsigned) as prefix, 
    t2.destination as destination, 
    FORMAT(sum(t1.terminatecauseid = 1), 0) as calls, 
    IFNULL(sec_to_time(avg(case when t1.terminatecauseid = 1 then t1.sessiontime end)), 0) as aloc, 
    CONCAT(TRUNCATE(sum(t1.terminatecauseid = 1) * 100/count(*), 1), '%') as asr, 
    sum(case when t1.terminatecauseid = 1 then t1.sessiontime end) as duration 
FROM 
    cc_call AS t1 
     inner join 
    cc_prefix as t2 ON t1.destination = t2.prefix 
     inner join 
    cc_country as t4 ON t1.destination like CONCAT(t4.countryprefix, '%') 
WHERE 
    t1.card_id = '133' AND t1.starttime >= ('2014-06-1') 
group by t4.countryprefix 
having duration is not null 
order by duration DESC 
LIMIT 0 , 25 

Im делая поисковую систему, я придумал правильные запросы, чтобы получить необходимую мне информацию. БД огромна (1 гб), а запрос иногда вызывает сбой HTTPd-сервера.Очень медленный поисковый запрос MySQL

Выполняется этот запрос, выполняется другой аналогичный запрос для разбивки на страницы (для определения количества страниц), а третий запрос выполняется для общего количества длительности и вызовов.

Все, что в совокупности приводит к очень плохим результатам. Вот пример db в sqlfiddle

Любые советы по повышению эффективности приветствуются.

Я попытался использовать «Просмотр» в какой-то момент с другим запросом, чтобы сузить результаты, пока не получилось.

+0

Какие индексы у вас есть? Соединяется ли первичный или объявленный вторичный ключ? – Philipp

+0

Я предоставил sqlfiddle для удобства, я сделал объединения без учета индексов. –

+1

. JOIN в неиндексированном поле требует полного сканирования таблицы. Неудивительно, что ваш запрос медленный. – Philipp

ответ

0

Поскольку структура БД не может быть изменена, а поиск подстановочных знаков занимает очень много времени, я решил использовать mysql View.

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

Это также помогло с полным запросом вызовов и разбиением на страницы. время ответа действительно хорошее.