По каким столбцам создать индекс для запроса по нескольким таблицам? - PullRequest
0 голосов
/ 17 октября 2019

с учетом следующего запроса, и меня просят создать индекс, чтобы ускорить этот конкретный запрос. Однако я не уверен, по каким столбцам создавать индекс, поскольку в запросе используются несколько таблиц и столбцов. Я склонен к созданию индекса для таблицы PassingStats, так как он, похоже, используется чаще всего в разделе WHERE запроса, но я не уверен. Должен ли это быть некластеризованный индекс?

Вот запрос:

SELECT P.name, R.position, T.mascot, G.date, Stats.touchdowns
FROM Player P, PlayedFor R, Team T, Game G, PassingStats Stats
WHERE P.pid = R.pid AND R.pid = Stats.pid
    AND Stats.touchdowns >= 6
    AND (Stats.tid = G.vtid OR Stats.tid = G.htid) 
    AND (Stats.season = G.season AND Stats.week = G.week)
    AND T.tid = Stats.tid AND R.tid = Stats.tid```

Thanks in advance!

Ответы [ 2 ]

1 голос
/ 17 октября 2019

перед добавлением индекса, давайте сначала проведем рефакторинг вашего запроса, если он улучшится. Кажется, есть разрыв между вашими объединенными таблицами. пожалуйста, попробуйте ниже запрос.

SELECT p.name
    , r.position
    , t1.mascot
    , t1.date
    , t1.touchdowns
FROM Player p
INNER JOIN PlayedFor r ON p.pid = r.pid
INNER JOIN
    (SELECT s.pid, t.mascot, coalesce(g1.date, g2.date) as date, s.touchdowns
        FROM PassingStats s
        INNER JOIN Team t on t.tid = s.tid
        LEFT JOIN Game g1 on s.tid = g1.vtid and s.season = g1.season and s.week = g1.week
        LEFT JOIN Game g2 on s.tid = g2.htid and s.season = g2.season and s.week = g2.week
        WHERE s.touchdowns >= 6) as t1
    ON t1.pid = r.pid
0 голосов
/ 19 октября 2019

Используйте синтаксис JOIN .. ON .., а не старый коммалистский синтаксис. После этого будет легко увидеть, что используется для JOINing по сравнению с тем, что используется для «фильтрации» (WHERE).

Я подозреваю, что единственная вещь в WHERE будет

Stats.touchdowns >= 6

Учитывая, что оптимизатор , вероятно, будет использовать Stats в качестве первой таблицы и использовать фильтр touchdowns. Итак, имейте

INDEX(touchdowns)

Доступ к другим таблицам, вероятно, будет осуществляться с использованием NLJ (Nested Loop Join), по одной таблице за раз.

Итак, убедитесь, что существует индекс (или PRIMARY KEY) в каждой последующей таблице, позволяя ей использовать значение из предыдущей таблицы, чтобы попасть в следующую таблицу.

OR - крушение поезда. Я не знаю, что случится с этим. Пожалуйста, укажите EXPLAIN SELECT ... и SHOW CREATE TABLE (для каждой таблицы).

Ваш вопрос задается как «индексный» вопрос. Если, в конечном счете, речь идет об ускорении запроса, то так и укажите. В этом случае я могу предложить превратить OR в UNION.

Простое создание индекса рассматривается здесь: http://mysql.rjweb.org/doc.php/index_cookbook_mysql

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...