2010-11-28 3 views
0
  • база данных вызовов которым получает неограниченное количество записей (может быть 10 или 10,000), как это:запросов к базе данных MySQL - скорость

    SELECT * FROM boo WHERE id = %d AND (approved = '1' OR (user = %d AND approved = '0'))

  • 2 обращений к базе данных, один, который получает ровно 10 записей, и еще один, который получает одну запись:

    SELECT * FROM boo WHERE id = %d AND approved = '1' LIMIT 10

    SELECT * FROM boo WHERE user = %d AND approved = '0'

Отметьте, что я не могу выполнить свой собственный запрос db. Я могу использовать только набор функций, которые выполняют запросы выше ...

Какой вариант более эффективен/быстрее?

ответ

2

Это действительно трудно ответить, но вот план, чтобы рассмотреть, чтобы получить лучшую производительность:

  1. Вы не указали, какие столбцы вы индексируете (если есть). Индексирование столбцов, которые вы хотите выбрать, и те, в которых вы используете условия, могут помочь вам получить лучшую производительность. Имейте в виду, что индексирование, помимо прочего, будет сопряжено с более тяжелыми расходами на запись. Если ваш общий случай для этих столбцов - поиск, я бы сказал, для индексации.

  2. Убедитесь, что вы выбрали нужные столбцы, а не все. Это еще один фактор, который даст вам лучшую производительность.

  3. Имейте в виду: каждый запрос имеет свои собственные накладные расходы. Добавление большего количества запросов будет сопряжено с большими затратами.

  4. Имейте в виду: вам нужно на самом деле о средней производительности. Например, я вижу, что один из ваших запросов зависит от определенного пользователя. Спросите себя, кто эти пользователи, являются ли они случайными пользователями веб-сайтов, которые будут иметь пару записей, связанных с ними? или являются ли эти пользователи плотным сообществом, которые продолжают размещать сообщения и имеют много комментариев, связанных с ними? Эти вопросы помогут вам определить и приблизиться к количеству возвращаемых результатов (в среднем), и это должно использоваться для принятия правильного решения о том, с каким способом вы должны пойти.

Надеюсь, что это поможет!

1

Попробуй и посмотри?

Предполагая, что они находятся в огромной таблице с соответствующими индексами, это может быть самым быстрым:

SELECT * FROM boo WHERE id = %d AND approved = '1' LIMIT 10 
UNION ALL 
SELECT * FROM boo WHERE user = %d AND approved = '0' 
+0

извините, я обновил свой вопрос :) Я не могу делать какие-либо пользовательские запросы :( – Alex 2010-11-28 07:32:36

1

Проверьте себя. Используйте EXPLAIN, вы можете получить обзор того, что происходит

Смежные вопросы