MySQL-запрос никогда не завершается при выполнении команды ORDER BY и COUNT - PullRequest
0 голосов
/ 27 сентября 2018

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

У меня очень похожий запрос, выполняющийся на другом сервере с другой схемой, но по сути он делает то же самое, и он завершаетсяпочти мгновенноЯ совершенно не понимаю, почему этот запрос никогда не завершается и длится вечно.

Я индексирую почти все в таблице символов и все еще не везет.

KEY `accountid` (`accountid`),
KEY `party` (`party`),
KEY `ranking1` (`level`,`exp`),
KEY `ranking2` (`gm`,`job`),
KEY `idx_characters_gm` (`gm`),
KEY `idx_characters_fame` (`fame`),
KEY `idx_characters_job` (`job`),
KEY `idx_characters_level` (`level`),
KEY `idx_characters_exp` (`exp`),

Когда я не включаюORDER BY он работает очень хорошо и заканчивается мгновенно.Когда я это сделаю, он будет работать вечно.

В БД всего 28 000 символов, поэтому вычисление ранга не может быть таким интенсивным, особенно если предел равен 1.

SELECT c.name
    , 1+(
      SELECT COUNT(*)
      FROM msd.characters as rankc
      WHERE rankc.level > c.level 
      LIMIT 1
    ) as jobRank
FROM characters as c
JOIN accounts as a
ON c.accountid = a.id
WHERE c.gm = 0 AND a.banned = 0
ORDER BY c.`level` DESC, c.exp DESC
LIMIT 1
OFFSET 0;

Любая помощь будет принята с благодарностью!

РЕДАКТИРОВАТЬ:

По сути, каждый персонаж имеет уникальную работу, и я хочу получить рейтинг работы этого персонажа.Порядок рейтингов по умолчанию - по уровню.Вот почему я делаю сравнение в моем jobRank SELECT.

Вот пример моего желаемого результата: желаемый результат

1 Ответ

0 голосов
/ 27 сентября 2018

Первое, что вы должны сделать, если у вас есть проблемы с производительностью запроса, это запустить объяснение вашего запроса (просто добавьте префикс к вашему выражению select с объяснением, и вы можете увидеть https://dev.mysql.com/doc/refman/5.7/en/using-explain.html для более подробной информации.) Хотя вы можете подуматьу вас есть все соответствующие индексы, иногда решения, принимаемые движком СУБД, не будут очевидны.Не удивляйтесь, если найдете одно или несколько полных сканирований таблиц, в которых, как вы думали, будут использоваться индексы (это, вероятно, самый распространенный источник проблем «запрос никогда не завершается»)

Обновление: на основе ваших результатов объясненияВ подзапросе запрос выполняет многократное сканирование всей таблицы, что, вероятно, является проблемой вашей производительности.Вы хотите попытаться получить этот подзапрос, используя индекс, поэтому я бы предложил исключить LIMIT 1 из подзапроса (предложение where отфильтровывает нежелательные уровни, а предложение group by отсутствует, поэтому должна быть возвращена только 1 строка)и посмотрим, справится ли это с работой.

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