Я думаю, что ответ в большой степени зависит от того, сколько денег вы хотите потратить на ваш проект - есть некоторые задачи, которые даже теоретически невозможно выполнить при строгих условиях (например, вы должны использовать только один слабый сервер).Я предполагаю, что вы готовы обновить вашу систему.
Прежде всего - ваша структура таблиц форсирует JOIN - я думаю, что вы должны избегать их, если это возможно, при написании высокопроизводительных приложений.Я не знаю, "attribute_tag_groups" есть, поэтому я предлагаю структуру таблицы: тег (varchar 255), id (int), id_type (enum (трек, альбом, исполнитель)).Идентификатор может быть artist_id, track_id или album_id в зависимости от id_type.Таким образом, вы сможете также собрать все ваши данные в одну таблицу, но, конечно, она будет использовать гораздо больше памяти.
Далее - вам следует рассмотреть возможность использования нескольких баз данных.Это поможет еще больше, если каждая база данных содержит только часть ваших данных (каждый поиск будет быстрее).Принятие решения о том, как распределить ваши данные между базами данных, обычно является довольно сложной задачей: я предлагаю вам составить некоторую статистику о длине тега, найти диапазоны длины, которые позволят получить аналогичные результаты трассировки / исполнителей, и жестко закодировать их в код поиска.
Конечно, вы должны рассмотреть настройку MySql (я уверен, что вы сделали это, но на всякий случай) - все ваши таблицы должны находиться в оперативной памяти - если это невозможно, попробуйте получить диски SSD, рейды и т. Д. Правильная индексация и база данныхтипы / настройки также очень важны (MySql может даже показать некоторые узкие места во внутренней статистике).
Это предложение может показаться безумным - но иногда полезно позволить PHP выполнить некоторые вычисления, которые MySql может выполнить сам.Базы данных MySql гораздо сложнее масштабировать, а сервер для обработки PHP может быть добавлен в считанные минуты.И разные потоки PHP могут работать на разных ядрах процессора - у MySql с этим проблемы.Вы можете повысить производительность PHP с помощью некоторых расширенных модулей (вы даже можете написать их самостоятельно - профилировать свои PHP-скрипты и узкие места жесткого кода в быстром C-коде).
Последнее, но я думаю, что самое важное - вы должен использовать какой-то тип кэширования.Я знаю, что это действительно сложно, но я не думаю, что был какой-то большой проект без действительно хорошей системы кэширования.В вашем случае некоторые теги, безусловно, будут намного более популярны, чем другие, поэтому это должно значительно повысить производительность.Кэширование является формой искусства - в зависимости от того, сколько времени вы можете на него потратить и сколько ресурсов доступно, вы можете сделать 99% всех запросов, использующих кеш.
Использование других баз данных / инструментов индексирования может помочь вам,но вы всегда должны учитывать теоретическое сравнение скорости запросов (O (n), O (nlog (n)) ...), чтобы понять, могут ли они действительно помочь вам - использование этих инструментов иногда дает вам низкий прирост производительности (например, постоянные 20%), но они могут усложнить разработку вашего приложения, и в большинстве случаев оно того не стоит.