«Выбрать *» не так плохо, как думают некоторые; Базы данных на основе строк извлекают всю строку, если они выбирают какую-либо из них, поэтому в ситуациях, когда вы не используете индекс покрытия, «SELECT *» по сути не медленнее, чем «SELECT a, b, c» (Примечание: там иногда является исключением, когда у вас большие большие двоичные объекты, но это крайний случай).
Перво-наперво - ваша база данных помещается в ОЗУ? Если нет, получите больше оперативной памяти. Нет, серьезно. Теперь, предположим, что ваша база данных слишком велика, чтобы разумно вписаться в оперативную память (скажем,> 32 ГБ), вам следует попытаться уменьшить количество случайных операций ввода-вывода, поскольку они, вероятно, удерживают вещи.
С этого момента я предполагаю, что вы используете надлежащее оборудование серверного класса с контроллером RAID в RAID1 (или RAID10 и т. Д.) И по крайней мере двумя шпинделями. Если нет, то иди и возьми это.
Вы можете определенно рассмотреть возможность использования кластерного индекса. В MySQL InnoDB вы можете кластеризовать только первичный ключ, что означает, что если что-то еще является первичным ключом, вам придется его изменить. С составными первичными ключами все в порядке, и если вы выполняете много запросов по одному критерию (скажем, user_id), определенное преимущество состоит в том, чтобы сделать его первой частью первичного ключа (вам нужно добавить что-то еще, чтобы сделать его уникальный).
В качестве альтернативы, вы можете сделать так, чтобы ваш запрос использовал индекс покрытия, и в этом случае вам не нужно, чтобы user_id был первичным ключом (фактически, это не должно быть). Это произойдет только в том случае, если все необходимые столбцы находятся в индексе, который начинается с user_id.
Что касается эффективности запросов, то WHERE user_id IN (большой список идентификаторов) почти наверняка является наиболее эффективным способом сделать это из SQL.
НО мои самые большие советы:
- Имейте в виду цель, решите, что это такое, и когда вы ее достигнете, остановитесь.
- Не поверь никому на слово - попробуй и посмотри
- Убедитесь, что ваша система тестирования производительности соответствует спецификации оборудования
- Убедитесь, что у вашей системы тестирования производительности тот же размер и тип данных, что и у рабочей (та же схема недостаточно хороша!).
- Используйте синтетические данные, если невозможно использовать производственные данные (копирование производственных данных может быть сложным с логистической точки зрения (помните, что ваша база данных имеет размер> 32 ГБ); это также может нарушать политики безопасности).
- Если ваш запрос является оптимальным (как это, вероятно, уже есть), попробуйте настроить схему, а затем саму базу данных.