2015-07-26 2 views
1

В настоящее время у меня массивный запрос (с использованием PHP и MySQL), и я не уверен, как его оптимизировать, чтобы уменьшить его массовую нагрузку 18-25 секунд. Я просмотрел предыдущие ответы и обнаружил, что они все пишут аналогично большое количество кода, что приводит к аналогичному времени выполнения скрипта, поэтому я хотел бы посмотреть, есть ли у кого-нибудь альтернативные идеи, а не те, которые уже есть Положения:Выберите MAX() из нескольких столбцов в MySQL

TLDR; нужно выбрать максимальную колонку для каждого аналитика ID и это происходит на массивной нагрузке и поэтому мне нужно, чтобы уменьшить его как-то

$qry = "SELECT DISTINCT ip,country_code,country, 
(SELECT MAX(region) FROM analytics RegOne WHERE bid='$id' AND RegOne.ip= IPOne.ip) AS region, 
(SELECT MAX(city) FROM analytics CitOne WHERE bid='$id' AND CitOne.ip= IPOne.ip) AS city, 
(SELECT MAX(os)  FROM analytics OSOne WHERE bid='$id' AND OSOne.ip= IPOne.ip) AS os, 
(SELECT MIN(browser) FROM analytics BroOne WHERE bid='$id' AND BroOne.ip= IPOne.ip) AS browser, 
(SELECT MIN(resolution) FROM analytics ResOne WHERE bid='$id' AND ResOne.ip= IPOne.ip) AS resolution, 
(SELECT MAX(timestamp) FROM analytics DateOne WHERE bid='$id' AND DateOne.ip= IPOne.ip) AS LatestDate 
FROM analytics AS IPOne 
WHERE bid='$id' 
ORDER BY LatestDate DESC 
LIMIT 15 OFFSET $offset"; 

Это берет данные из массивного стола, и поэтому я не ожидал чтобы сделать 0 секунд, однако любое уменьшение времени будет штрафом, а не ~ 21 секундой.

ответ

0

У вас должен быть составной КЛЮЧ на (bid, ip). Если у вас есть ключ на (bid) затем добавить (или заменить его) (bid, ip)

+0

Я просто проиндексировал их; по какой-то причине он не позволил мне сделать из них первичный ключ/составной ключ, однако спасибо! Индексация, похоже, работала как шарм. – Josh

+0

@ Josh «ключ» и «индекс» означают то же самое в MySQL. У вас может быть только один первичный ключ, у вас может быть столько других ключей, сколько вы хотите. – Barmar

1

Почему не

SELECT ip, country_code, country, 
    MAX(region) as region, 
    MAX... 
    MAX(timestamp) as LatestDate 
FROM analytics 
WHERE bid = '$id' 
GROUP BY ip, country_code, country 
ORDER BY LatestDate DESC 
LIMIT 15 OFFSET $offset"; 

Вы должны иметь индекс, начиная с bid. Это может быть лучше:

INDEX(bid, ip, country_code, country) 
+0

Вот как я это сделаю. Избегание коррелированных подзапросов в списке SELECT обычно дает лучшую производительность. – spencer7593