Разбиение большой таблицы MySQL, которая использует LIKE для поиска - PullRequest
3 голосов
/ 25 марта 2012

У меня есть таблица с 80 миллионами записей.Структура таблицы:

  • id - автоинкремент,
  • код - буквенно-цифровой код от 5 до 100 символов,
  • другие поля.

Наиболее часто используемым запросом является

SELECT * FROM table
WHERE code LIKE '%{user-defined-value}%'

Количество запросов растет, а также количество записей.Очень скоро у меня будут проблемы с производительностью.

Есть ли способ разбить таблицу на части?Или, может быть, есть другие способы оптимизации таблицы?

Ответы [ 2 ]

2 голосов
/ 25 марта 2012

Ведущий % в поиске - убийца здесь.Он отрицает использование любого индекса.

Единственное, о чем я могу думать, это разбить таблицу на основе длины кода.

Например, если введенный код состоит из 10 символовlong, затем сначала выполните поиск в таблице с 10-символьными кодами без начального знака процента, затем выполните поиск в таблице с 11-значными кодами, с ведущим знаком процента, а затем в таблице с 12-символьными кодами, с ведущим знаком процента иon.

Это избавляет вас от поиска во всех кодах длиной менее 10 символов, которые никогда не будут совпадать.Кроме того, вы можете использовать индекс для одного из поисков (первый).

Это также поможет сохранить размеры таблицы несколько меньшими.

Вы можете использовать UNIONчтобы выполнить все запросы одновременно, хотя вы, вероятно, захотите создать запрос динамически.

Вам также следует проверить, может ли индексирование FULLTEXT быть лучшим решением.

0 голосов
/ 25 марта 2012

Некоторые мысли:

  1. Вы можете разбить таблицу на несколько небольших таблиц на основе определенного условия. Например, на ID возможно или может быть code или могут быть любые другие поля. В основном это означает, что вы храните определенный тип записей в таблице и разбиваете разные типы на разные таблицы

  2. Попробуйте MySQL Partitioning

  3. Если возможно. очистите старые записи, или вы можете хотя бы подумать о перемещении их в другую архивную таблицу

  4. Вместо LIKE рассмотрите возможность использования REGEXP для поиска по регулярному выражению

  5. Вместо запуска SELECT *, попробуйте выбрать только выборочные столбцы SELECT id, code, ...

  6. Я не уверен, связан ли этот запрос с поиском в вашем приложении, где введенное пользователем значение сравнивается со столбцом code и результаты отражаются для пользователя. Но если да, вы можете попытаться добавить опции в поисковый запрос, например, спросить пользователя, хочет ли он точное совпадение или должен начать с совпадения и т. Д. Таким образом, вам не обязательно запускать совпадение LIKE каждый раз

  7. Это должен был быть первый пункт, но я предполагаю, что у вас есть правильные индексы в таблице

  8. Попробуйте использовать больше кеша запросов. Лучший способ его использования - избегать частых обновлений таблицы, поскольку при каждом обновлении очищается кэш запросов. Чем меньше обновлений, тем больше вероятность того, что MySQL кеширует запросы, что будет означать более быстрые результаты

Надеюсь, что выше помогает!

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