В Java все находится в форме класса.
Если вы хотите использовать любой объект, тогда у вас есть две фазы:
Пример:
Object a;
a=new Object();
То же самое для концепции массива
Item i[]=new Item[5];
i[0]=new Item();
Если вы не дают секцию инициализации, тогда возникает NullpointerException
.
В MySQL InnoDB SELECT COUNT(*) WHERE secondary_index = ?
- это дорогостоящая операция, и когда у пользователя много сообщений, этот запрос может занять много времени. Даже при использовании индекса движок все равно должен считать все соответствующие записи. Производительность будет ухудшаться с ростом общего количества сообщений.
С другой стороны, SELECT MAX(id) WHERE secondary_index = ?
может очень эффективно доставить самый высокий идентификатор в этом индексе, выполнив так называемое сканирование свободного индекса . Производительность останется почти постоянной.
Если вы хотите понять, почему, рассмотрите поиск структуры данных B + Tree , которую InnoDB использует для организации своих данных.
Я предлагаю вам перейти к SELECT MAX(id)
, если требуется только проверить, есть ли новые сообщения (а не их количество).
Кроме того, если вы полагаетесь на количество сообщений, вы можете открыть пробел для условий гонки. Что если пользователь удалит сообщение и получит новое между двумя интервалами опроса?
Если вам нужно узнать количество новых сообщений, то использование 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)
, чтобы возвращать сообщения только между двумя конкретными пользователями.