У меня есть таблица со следующей структурой:MySQL несколько объединений медлительности
Я получил все мои первичные ключи правильно и каждый Int & дата столбца имеет индекс, и (playerId, groupId)
в player_groups
- уникальный индекс. Все таблицы используют InnoDB, а отношения, которые вы видите, также являются ссылками в InnoDB.
Полный источник базы данных, с данными, примерно подобно примерам, я продемонстрирую ниже: https://www.dropbox.com/s/kzf89occlq4legy/bf4_performance.sql
запросов:
Запрос # 1:
SELECT * FROM playerkills ORDER BY date DESC LIMIT 300;
Запрос # 2:
SELECT p.playerName AS player, p2.playerName AS target, w.weaponName AS weapon, date, headshot, s.serverName AS server FROM playerkills JOIN players p ON playerkills.playerId = p.playerId JOIN players p2 ON playerkills.targetId = p2.playerId JOIN weapons w ON playerkills.weaponId = w.weaponId JOIN servers s ON playerkills.serverId = s.serverId ORDER BY date DESC LIMIT 300;
Производительность на моей собственной машине, которая имеет много ресурсов:
- Запрос # 1: 0,0016 сек
- Запрос # 2: 1,3050 сек
Производительность на живом сервере базы данных, которая имеет значительно меньше ресурсов:
- Запрос # 1: 0,046 сек
- Запрос # 2: 1,297 сек
Я боюсь, что что-то сильно влияет на производительность, так как отлично работает без каких-либо заявлений JOIN
. Может ли кто-нибудь пролить свет на это?
ps (Редактировать). Также, возможно, важно добавить: эта база данных обновляется в реальном времени каждые несколько секунд, поэтому результаты запросов нельзя кэшировать так же, как запросы на статические данные.
EDIT 2: профилирование на статической версии (на localhost
) дал мне эту картину:
Выход из EXPLAIN
:
тем больше столов вы присоединитесь тем медленнее он получает, может улучшить с помощью правильной индексации, но не так быстро, как одной таблицы выберите – Konstantin
@ user2864740 Добавлены более подробные данные по запросу. – skiwi
Вы присоединяетесь к 'p2' с' playerkills' на 'targetId', который не имеет индекса. Это означает, что необходимо выполнить полное сканирование таблицы. Попробуйте добавить индекс в 'playerkills' и снова отобразить вывод' EXPLAIN'. –