MySQL ИЛИ по сравнению с В производительности

Google Cloud Pub / Sub - это глобальный сервис, доступный везде. Невозможно выбрать, где вы хотите разместить свою услугу Pub / Sub, но она будет в ближайшем регионе к местоположению вашего проекта. Тот факт, что он доступен в новом регионе, означает, что теперь в этом регионе имеется необходимая инфраструктура для размещения службы Pub / Sub.

Здесь вы можете увидеть расположение продуктов Google Cloud , а также заметки о выпуске в Pub / Sub

[EDIT]

Несмотря на это, есть несколько способов помочь вам обеспечить соответствие:

  • Как упоминалось выше, Pub / Sub делает все возможное, чтобы ваши данные находились в ближайшем к вам месте. источник публикации, и как только он будет сохранен, эти данные не будут перемещены без вашего явного действия.
  • Pub / Sub обеспечивает мониторинг места хранения данных, поэтому вы можете отслеживать любые потенциальные нарушения и предпринимать действия, отбрасывая отставание, используя функциональность поиска Pub / Sub или гарантируя, что оно быстро обрабатывается.
  • Риск может быть ограничен путем уменьшения продолжительности хранения сообщений .

169
задан potashin 21 December 2014 в 01:20
поделиться

7 ответов

Мне нужно было знать это наверняка, поэтому я провел бенчмаркинг обоих методов. Я последовательно обнаружил, что IN намного быстрее, чем OR.

Не верьте людям, которые высказывают свое "мнение", наука - это все о тестировании и доказательствах.

Я выполнил цикл из 1000 раз эквивалентных запросов (для согласованности я использовал sql_no_cache):

IN: 2.34969592094s

OR: 5. 83781504631s

Обновление:
(у меня нет исходного кода оригинального теста, так как он был проведен 6 лет назад, хотя он возвращает результат в том же диапазоне, что и этот тест)

В ответ на просьбу привести пример кода для проверки этого, вот самый простой возможный вариант использования. Используя Eloquent для простоты синтаксиса, необработанный эквивалент SQL выполняет то же самое.

$t = microtime(true); 
for($i=0; $i<10000; $i++):
$q = DB::table('users')->where('id',1)
    ->orWhere('id',2)
    ->orWhere('id',3)
    ->orWhere('id',4)
    ->orWhere('id',5)
    ->orWhere('id',6)
    ->orWhere('id',7)
    ->orWhere('id',8)
    ->orWhere('id',9)
    ->orWhere('id',10)
    ->orWhere('id',11)
    ->orWhere('id',12)
    ->orWhere('id',13)
    ->orWhere('id',14)
    ->orWhere('id',15)
    ->orWhere('id',16)
    ->orWhere('id',17)
    ->orWhere('id',18)
    ->orWhere('id',19)
    ->orWhere('id',20)->get();
endfor;
$t2 = microtime(true); 
echo $t."\n".$t2."\n".($t2-$t)."\n";

1482080514.3635
1482080517.3713
3.0078368186951

$t = microtime(true); 
for($i=0; $i<10000; $i++): 
$q = DB::table('users')->whereIn('id',[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20])->get(); 
endfor; 
$t2 = microtime(true); 
echo $t."\n".$t2."\n".($t2-$t)."\n";

1482080534.0185
1482080536.178
2.1595389842987

242
ответ дан 23 November 2019 в 20:51
поделиться

Я знаю, что до тех пор, пока у вас есть индекс по полю, МЕЖДУ будет использовать его, чтобы быстро найти один конец, а затем перейти к другому. Это наиболее эффективно.

Каждое ОБЪЯСНЕНИЕ, которое я видел, показывает, что «IN (...)» и «... ИЛИ ...» взаимозаменяемы и одинаково (не) эффективны. Как и следовало ожидать, так как оптимизатор не может знать, содержат ли они интервал или нет. Это также эквивалентно UNION ALL SELECT для отдельных значений.

0
ответ дан 23 November 2019 в 20:51
поделиться

Из того, что я понимаю о том, как компилятор оптимизирует эти типы запросов, использование предложения IN более эффективно, чем несколько предложений OR. Если у вас есть значения, в которых можно использовать предложение BETWEEN, это еще более эффективно.

0
ответ дан 23 November 2019 в 20:51
поделиться

Бьюсь об заклад, они одинаковы, вы можете запустить тест, выполнив следующее:

переберите "in (1,2,3,4)" 500 раз и посмотрим, сколько времени это займет. переверните версию "= 1 или = 2 или = 3 ..." 500 раз и посмотрите, как долго она будет выполняться.

вы также можете попробовать способ соединения, если someField является индексом, а ваша таблица велика, это может быть быстрее ...

SELECT ... 
    FROM ... 
        INNER JOIN (SELECT 1 as newField UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4) dt ON someFIELD =newField

Я попробовал описанный выше метод соединения на моем SQL Server, и он почти такой же, как в (1,2,3,4), и оба они приводят к поиску кластеризованного индекса. Я не уверен, как MySQL справится с ними.

2
ответ дан 23 November 2019 в 20:51
поделиться

ИЛИ будет медленнее. Будет ли IN или BETWEEN быстрее, будет зависеть от ваших данных, но я ожидаю, что BETWEEN будет быстрее, как обычно, поскольку он может просто взять диапазон из индекса (при условии, что someField проиндексирован).

3
ответ дан 23 November 2019 в 20:51
поделиться

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

Это пример, в котором вы хотите написать запрос обе стороны; заставить его работать, а затем используйте EXPLAIN, чтобы выяснить различия в исполнении.

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

Это могло бы помочь: http: // forge.mysql.com/wiki/Top10SQLPerformanceTips

Regards,
Франк

11
ответ дан 23 November 2019 в 20:51
поделиться

Я думаю, что МЕЖДУ будет быстрее, поскольку его следует преобразовать в:

Field >= 0 AND Field <= 5

Насколько я понимаю, IN в любом случае преобразуется в набор операторов OR. Значение IN - это простота использования. (Экономия на необходимости вводить имя каждого столбца несколько раз, а также упрощает использование с существующей логикой - вам не нужно беспокоиться о приоритете AND / OR, потому что IN - это один оператор. С кучей операторов OR вы получаете чтобы вы заключили их в круглые скобки, чтобы убедиться, что они оцениваются как одно условие.)

Единственный реальный ответ на ваш вопрос - ПРОФИЛЬ ВАШИХ ЗАПРОСОВ . Тогда вы узнаете, что работает лучше всего в вашей конкретной ситуации.

16
ответ дан 23 November 2019 в 20:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: