Я не уверен, что у меня есть правильные индексы или я могу улучшить скорость моего запроса в 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

Надеюсь, что это ускорит