Я разрабатываю очень простую (с точки зрения функциональности), но сложную (с точки зрения масштабируемости) систему, в которой пользователи могут отправлять сообщения друг другу. Думайте об этом как об очень простом чате. Пользователь может вставить сообщение через страницу php. Сообщение короткое и имеет имя получателя.
На другой странице php пользователь может просмотреть все сообщения, которые были ему отправлены, и затем удалить их в базе данных. Вот и все. Это все функциональные возможности, необходимые для этой системы. Как я должен идти о разработке этого (с точки зрения базы данных / PHP)?
Пока у меня есть такая таблица:
- field1 -> message (varchar)
- field2 -> получатель (varchar)
Теперь для sql insert я обнаружил, что время, которое требуется, постоянно, независимо от количества строк в базе данных. Так что мой send.php будет иметь гарантированное время возврата, что хорошо.
Но для удаления сообщений мой pull.php займет больше времени, так как количество строк увеличивается! Я считаю, что sql select (и delete) будет занимать больше времени по мере роста строк, и это верно даже после того, как я добавил индекс для поля получателя.
Теперь, если бы это было просто так, что пользователям пришлось бы ждать дольше, прежде чем их сообщения были извлечены на php, тогда все было бы в порядке. Но меня беспокоит то, что когда каждое время службы pull.php занимает очень много времени, сервер php начинает отказывать в соединениях с каким-либо запросом. Или хуже, сервер может просто умереть.
Итак, вопрос в том, как спроектировать это так, чтобы оно масштабировалось? Любые советы / подсказки?
PS. Некоторые оценки по номерам:
- количество пользователей начинается с 50 000 и увеличивается.
- каждый пользователь в среднем хранит около 10 сообщений, прежде чем другой конец может его сбросить.
- каждый пользователь отправляет около 10-20 сообщений в день.
ОБНОВЛЕНИЕ от чтения ответов до сих пор:
Я просто хочу уточнить, что удаление меньшего количества сообщений из файла pull.php не помогает. Даже просто потянуть одно сообщение займет много времени, когда таблица огромна. Это связано с тем, что в таблице есть все сообщения, поэтому вы должны сделать такой выбор:
select message from DB where recipient = 'John'
даже если вы измените его на это, это не сильно поможет
select top 1 message from DB where recipient = 'John'
Пока что из ответов кажется, что чем длиннее таблица, тем медленнее будет выбор O (n) или чуть лучше, никак не обойти его. Если это так, как я должен справиться с этим со стороны PHP? Я не хочу, чтобы страница php проваливалась на http, потому что пользователь будет сбит с толку и в итоге обновится, как сумасшедший, что делает его еще хуже.