COUNT (*) или MAX (id) - что быстрее?

В Java все находится в форме класса.

Если вы хотите использовать любой объект, тогда у вас есть две фазы:

  1. Объявить
  2. Инициализация

Пример:

  • Объявление: Object a;
  • Инициализация: a=new Object();

То же самое для концепции массива

  • Объявление: Item i[]=new Item[5];
  • Инициализация: i[0]=new Item();

Если вы не дают секцию инициализации, тогда возникает NullpointerException.

14
задан Boann 9 April 2019 в 15:35
поделиться

2 ответа

В MySQL InnoDB SELECT COUNT(*) WHERE secondary_index = ? - это дорогостоящая операция, и когда у пользователя много сообщений, этот запрос может занять много времени. Даже при использовании индекса движок все равно должен считать все соответствующие записи. Производительность будет ухудшаться с ростом общего количества сообщений.

С другой стороны, SELECT MAX(id) WHERE secondary_index = ? может очень эффективно доставить самый высокий идентификатор в этом индексе, выполнив так называемое сканирование свободного индекса . Производительность останется почти постоянной.

Если вы хотите понять, почему, рассмотрите поиск структуры данных B + Tree , которую InnoDB использует для организации своих данных.

Я предлагаю вам перейти к SELECT MAX(id), если требуется только проверить, есть ли новые сообщения (а не их количество).

Кроме того, если вы полагаетесь на количество сообщений, вы можете открыть пробел для условий гонки. Что если пользователь удалит сообщение и получит новое между двумя интервалами опроса?

0
ответ дан Kaii 9 April 2019 в 15:35
поделиться

Если вам нужно узнать количество новых сообщений, то использование Select count(*) from Messages where user_id in (sender, recipient) and id > last_seen_id будет вашим лучшим вариантом.

Я фанат использования exists, где это возможно, поэтому для определения, есть ли новые сообщения, мой запрос будет Select exists(Select 1 from Messages where user_id in (sender, recipient) and id > last_seen_id). Преимущество существует в том, что как только он находит 1 запись, он возвращает true.

Редактировать: чтобы избежать путаницы при чтении этого ответа, оба этих запроса также будут включать проверку для other_user_id in (sender, recipient), чтобы возвращать сообщения только между двумя конкретными пользователями.

0
ответ дан Aaron 9 April 2019 в 15:35
поделиться
Другие вопросы по тегам:

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