Оптимизация JOIN запросов

315
11 февраля 2017, 07:17

Помогите ускорить выборку из базы Mysql При выборке 10 записей уходит 2.5 секунды!

SELECT fr.*, fr.status AS fstatus, us.*, bk.*, od.*, ev.eventName, ev.date AS evDate, ev.homeTeam, ev.awayTeam, ev.eventId AS eventId, ev.href AS eventHref, sp.name AS sportName, 
    lg.leagueId, lg.name AS lgName, cn.name AS cnName, sp.name AS spName FROM forecast fr
        JOIN user us ON
            us.userId = fr.userId AND (SELECT SUM(profit) as profit FROM `forecast` WHERE userId = us.userId AND status IS NOT NULL AND profit IS NOT NULL ) > -100000
        JOIN bookmaker bk ON
            bk.bookmakerId = fr.bid
        JOIN odds od ON
            fr.oddsId = od.oddsId
        JOIN event ev ON
            od.eventId = ev.eventId
        JOIN league lg ON
            lg.leagueId = ev.leagueId 
        JOIN country cn ON
            lg.countryId = cn.countryId
        JOIN sport sp ON
            lg.sportId = sp.sportId     
                WHERE ev.date > 0 AND fr.forecast IS NOT NULL GROUP BY fr.forecastId ORDER BY fr.date DESC LIMIT 0, 10

Возможно его както сгруппировать?

Answer 1

Без EXPLAIN и схемы таблиц трудно оценить сложность запроса. Обязательно прикладывайте результат EXPLAIN EXTEND и схему! А с ходу могу посоветовать сначал выбрать userId:

SELECT userId FROM `forecast` 
WHERE status IS NOT NULL AND profit IS NOT NULL
GROUP BY userId
HAVING SUM(profit) > -100000;

Потом уже:

SELECT fr.*, fr.status AS fstatus, us.*, bk.*, od.*, ev.eventName, ev.date AS evDate, ev.homeTeam, ev.awayTeam, ev.eventId AS eventId, ev.href AS eventHref, sp.name AS sportName, lg.leagueId, lg.name AS lgName, cn.name AS cnName, sp.name AS spName 
  FROM forecast fr
  JOIN user us ON
    us.userId = fr.userId
  JOIN bookmaker bk ON
    bk.bookmakerId = fr.bid
  JOIN odds od ON
    fr.oddsId = od.oddsId
  JOIN event ev ON
    od.eventId = ev.eventId
  JOIN league lg ON
    lg.leagueId = ev.leagueId 
  JOIN country cn ON
    lg.countryId = cn.countryId
  JOIN sport sp ON
    lg.sportId = sp.sportId     
  WHERE userId IN (???????) ev.date > 0 AND fr.forecast IS NOT NULL 
  GROUP BY fr.forecastId 
  ORDER BY fr.date DESC LIMIT 0, 10;

Можно даже подзапрос сунуть в (???????) - но не рекомендую. Ну и естественно обязательно чтоб был индекс на userId, ну а далее можно оптимизировать с помощью составных индексов

READ ALSO
Dbeaver не отображает данные таблицы

Dbeaver не отображает данные таблицы

При попытке отобразить данные выпадает ошибка

603
Перевод приложения при входе [требует правки]

Перевод приложения при входе [требует правки]

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

291
обработка выбора AutoCompleteTextView

обработка выбора AutoCompleteTextView

Задача такаяВыбирается некоторый элемент из списка

357
Как выполнять javascript команды через TChromium?

Как выполнять javascript команды через TChromium?

Пытаюсь выполнить JavaScript код в TChromium, но получаю ошибку:

495