Google Cloud Pub / Sub - это глобальный сервис, доступный везде. Невозможно выбрать, где вы хотите разместить свою услугу Pub / Sub, но она будет в ближайшем регионе к местоположению вашего проекта. Тот факт, что он доступен в новом регионе, означает, что теперь в этом регионе имеется необходимая инфраструктура для размещения службы Pub / Sub.
Здесь вы можете увидеть расположение продуктов Google Cloud , а также заметки о выпуске в Pub / Sub
[EDIT]
Несмотря на это, есть несколько способов помочь вам обеспечить соответствие:
Мне нужно было знать это наверняка, поэтому я провел бенчмаркинг обоих методов. Я последовательно обнаружил, что 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
Я знаю, что до тех пор, пока у вас есть индекс по полю, МЕЖДУ будет использовать его, чтобы быстро найти один конец, а затем перейти к другому. Это наиболее эффективно.
Каждое ОБЪЯСНЕНИЕ, которое я видел, показывает, что «IN (...)» и «... ИЛИ ...» взаимозаменяемы и одинаково (не) эффективны. Как и следовало ожидать, так как оптимизатор не может знать, содержат ли они интервал или нет. Это также эквивалентно UNION ALL SELECT для отдельных значений.
Из того, что я понимаю о том, как компилятор оптимизирует эти типы запросов, использование предложения IN более эффективно, чем несколько предложений OR. Если у вас есть значения, в которых можно использовать предложение BETWEEN, это еще более эффективно.
Бьюсь об заклад, они одинаковы, вы можете запустить тест, выполнив следующее:
переберите "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 справится с ними.
ИЛИ будет медленнее. Будет ли IN или BETWEEN быстрее, будет зависеть от ваших данных, но я ожидаю, что BETWEEN будет быстрее, как обычно, поскольку он может просто взять диапазон из индекса (при условии, что someField проиндексирован).
Это зависит от того, что вы делаете; насколько широкий диапазон, какой тип данных (я знаю, что в вашем примере используется числовой тип данных, но ваш вопрос может также относиться ко многим различным типам данных).
Это пример, в котором вы хотите написать запрос обе стороны; заставить его работать, а затем используйте EXPLAIN, чтобы выяснить различия в исполнении.
Я уверен, что есть конкретный ответ на этот вопрос, но именно так я бы, практически говоря, выяснил ответ на мой заданный вопрос.
Это могло бы помочь: http: // forge.mysql.com/wiki/Top10SQLPerformanceTips
Regards,
Франк
Я думаю, что МЕЖДУ будет быстрее, поскольку его следует преобразовать в:
Field >= 0 AND Field <= 5
Насколько я понимаю, IN в любом случае преобразуется в набор операторов OR. Значение IN - это простота использования. (Экономия на необходимости вводить имя каждого столбца несколько раз, а также упрощает использование с существующей логикой - вам не нужно беспокоиться о приоритете AND / OR, потому что IN - это один оператор. С кучей операторов OR вы получаете чтобы вы заключили их в круглые скобки, чтобы убедиться, что они оцениваются как одно условие.)
Единственный реальный ответ на ваш вопрос - ПРОФИЛЬ ВАШИХ ЗАПРОСОВ . Тогда вы узнаете, что работает лучше всего в вашей конкретной ситуации.