Автозаполнение пользовательского интерфейса jQuery: поиск по двум огромным таблицам MySQL не связан - PullRequest
0 голосов
/ 08 апреля 2019

Мой сайт ссылается на более чем 100 000 статей 20 000 разных авторов. Мне бы хотелось, чтобы поиск по автозаполнению в пользовательском интерфейсе jQuery проводился в двух таблицах - либо по названию статьи, либо по имени автора.

Две таблицы в основном:

Таблица статей

  • заголовок (например, это заголовок)
  • Слизняк (например, это-это-название)

Автор таблицы

  • имя (например: Джон Доу)
  • Слизняк (например: Джон-Доу)

Информация о слаге должна быть получена, так как строка поиска будет перенаправлена ​​на article.php или author.php в зависимости от результата поиска.

Меня беспокоит то, что такой анализ этих двух таблиц занимает очень много времени, более 30 секунд:

SELECT title, ar.slug, name, au.slug
FROM articles ar,author au
WHERE published = 1
AND (title LIKE :term OR name LIKE :term)

Столбец уже проиндексирован.

Есть ли лучший подход? Спасибо за вашу помощь.

1 Ответ

1 голос
/ 08 апреля 2019

Причина, по которой ваш запрос такой медленный, заключается в том, что у вас нет условия для JOIN, и поэтому вы получаете потенциальный набор результатов 100 000 * 20 000, т.е. 2B строк, которые должны быть отфильтрованы вашим предложением WHERE.Поскольку для этого запроса не требуется какого-либо отношения между таблицами, было бы лучше просто использовать UNION, добавив поле для различия между author и title:

SELECT 'author' AS type, name AS value, slug
FROM author
WHERE published = 1 AND name LIKE :term
UNION
SELECT 'title' AS type, title, slug
FROM articles
WHERE published = 1 AND title LIKE :term
...