Я не уверен, что у меня есть правильные индексы или я могу улучшить скорость моего запроса в MySQL?
В моем запросе есть соединение, и похоже, что он использует два индекса, что делает его более сложным. Я не уверен, могу ли я улучшить это, но я думал, что попрошу.
Запрос создает список записей с похожими ключевыми словами, которые запрашивает запись.
Вот мой запрос.
SELECT match_keywords.padid,
COUNT(match_keywords.word) AS matching_words
FROM keywords current_program_keywords
INNER JOIN keywords match_keywords
ON match_keywords.word = current_program_keywords.word
WHERE match_keywords.word IS NOT NULL
AND current_program_keywords.padid = 25695
GROUP BY match_keywords.padid
ORDER BY matching_words DESC
LIMIT 0, 11
ОБЪЯСНЕНИЕ
![alt text]()
Слово является varchar (40).
Ответы
Ответ 1
Вы можете начать с попытки удалить тест IS NOT NULL, который неявно удаляется COUNT в поле. Также похоже, что вы хотели бы опустить 25695 из match_keywords
, иначе 25695 (или другое) наверняка будет отображаться как "лучшее" совпадение в пределах вашего 11-рядового предела?
SELECT match_keywords.padid,
COUNT(match_keywords.word) AS matching_words
FROM keywords current_program_keywords
INNER JOIN keywords match_keywords
ON match_keywords.word = current_program_keywords.word
WHERE current_program_keywords.padid = 25695
GROUP BY match_keywords.padid
ORDER BY matching_words DESC
LIMIT 0, 11
Затем подумайте, как вы будете делать это как человек.
- Вы должны начать с padid (25695) и получить все слова для этого падипа
- Из этого списка слов снова вернитесь в таблицу и для каждого соответствующего слова,
получить их padid (предполагается, что он не дублируется на
padid + word
)
- группировать padid вместе и считать их
- закажите подсчеты и верните самые высокие 11
С вашим списком из трех отдельных индексов с одним столбцом первые два шага (оба из которых включают только 2 столбца) всегда будут переходить от индекса обратно к данным, чтобы получить другой столбец. Покрытие индексов может помочь здесь - создать два составных индекса для тестирования
create index ix_keyword_pw on keyword(padid, word);
create index ix_keyword_wp on keyword(word, padid);
С помощью этих составных индексов вы можете удалить индексы с одним столбцом на padid
и word
, так как они охвачены этими двумя.
Примечание. Вы всегда должны выполнять настройку производительности SELECT против
- размер индексов (чем больше вы создаете больше для хранения)
- производительность вставки/обновления (чем больше индексов, тем больше времени требуется для фиксации, так как он должен обновлять данные, а затем обновлять все индексы)
Ответ 2
Попробуйте следующее... обеспечить индекс на PadID и один на WORD. Затем, изменив порядок SELECT WHERE, специалист должен сначала оптимизировать PADID ключевого слова CURRENT, а затем присоединиться к другим... Исключить присоединение к себе. Кроме того, поскольку вы проверяли равенство во внутреннем соединении на соответствие ключевым словам... если текущее ключевое слово проверено на значение null, оно никогда не должно присоединяться к нулевому значению, таким образом устраняя сравнение в псевдониме ключевых слов MATCH, рассматривая каждое сравнение как искать NULL...
SELECT STRAIGHT_JOIN
match_keywords.padid,
COUNT(*) AS matching_words
FROM
keywords current_program_keywords
INNER JOIN keywords match_keywords
ON match_keywords.word = current_program_keywords.word
and match_keywords.padid <> 25695
WHERE
current_program_keywords.padid = 25695
AND current_program_keywords.word IS NOT NULL
GROUP BY
match_keywords.padid
ORDER BY
matching_words DESC
LIMIT
0, 11
Ответ 3
Вы должны индексировать следующие поля (проверьте, какая таблица соответствует)
match_keyword.padid
current_program_keywords.padid
match_keyword.words
current_program_keywords.words
Надеюсь, что это ускорит