Если вы решили сделать это исключительно в MySQL, то вам следует создавать индексы, которые будут работать для всех ваших запросов.Можно иметь 20 или 30 индексов, если вы сортируете 20-30 различных запросов.Но вы можете, вероятно, сделать это с гораздо меньшими показателями, чем это.
Вам также необходимо спланировать, как будут поддерживаться эти индексы.Я предполагаю, потому что это для каталогов поставщиков, что данные не будут сильно меняться.В этом случае простое создание всех необходимых вам индексов должно хорошо работать.Если строки данных будут часто редактироваться или вставляться в режиме реального времени, то вы должны учитывать это при индексировании - тогда наличие 20 или 30 индексов может быть не очень хорошей идеей (поскольку MySQL будет постоянно вынужден обновлять их все),Вы также должны рассмотреть, какой механизм хранения MySQL использовать.Если ваши данные никогда не меняются, MyISAM (механизм по умолчанию, в основном быстрые плоские файлы) является хорошим выбором.Если он сильно меняется, то вы должны использовать InnoDB, чтобы получить блокировку на уровне строк.InnoDB также позволит вам определить кластеризованный индекс, который является специальным индексом, который контролирует порядок вещей, хранящихся на диске.Таким образом, если бы у вас был один конкретный запрос, который выполняется 99% времени, вы могли бы создать для него кластерный индекс, и все данные уже были бы в правильном порядке на диске и возвращали бы супер супер быстро.Но каждая вставка или обновление данных приведет к переупорядочению всей таблицы на диске, что не очень быстро для большого количества данных.Вы никогда не использовали бы его, если бы данные вообще часто менялись, и вам, возможно, придется пакетно загружать обновления данных (например, новые версии миллиона строк поставщика).Опять же, все сводится к тому, будете ли вы обновлять его никогда, время от времени или постоянно в режиме реального времени.
Наконец, вам следует рассмотреть альтернативные способы, чем делать это в MySQL.Сейчас существует множество действительно хороших поисковых продуктов, таких как Apache Solr или Sphinx (упомянутых в комментарии выше), которые могут значительно облегчить вашу жизнь при кодировании самих поисковых интерфейсов.Вы можете индексировать каталоги в одном из них, а затем использовать их для предоставления действительно потрясающих функций поиска, таких как полнотекстовый и / или граненый поиск.Это похоже на частную поисковую систему Google, которая индексирует ваши материалы, это хороший способ описать, как они работают.Для написания кода для взаимодействия с поисковым сервером требуется время, но вы, скорее всего, сэкономите это время, не прибегая к написанию и обдумыванию проблемы индексирования и других проблем, о которых я упоминал выше.
Если вы это сделаетепросто создайте все индексы, узнайте, как использовать команду EXPLAIN в MySQL.Это позволит вам увидеть, каким будет план MySQL для выполнения запроса.Вы можете создать индексы, затем повторно запустить EXPLAIN для ваших запросов и посмотреть, как MySQL собирается их использовать.Таким образом, вы можете быть уверены, что у каждого из ваших методов запросов есть индексы, поддерживающие его, и не будете использовать сканирование всей таблицы данных для поиска.С таким количеством строк, о котором вы говорите, каждый запрос ДОЛЖЕН иметь возможность использовать индексы для поиска своих данных.Если вы поймете это правильно, все будет хорошо.