Стек:
PHP (Laravel), JS, MySQL, Nginx, Websockets.
Есть canvas размером
2000х1000 (~2 млн. пикселей суммарно).
На этом полотне в реалтайме рисуют N подключенных клиентов по веб-сокетам.
Данные о пикселях лежат в MySQL.
ТаблицаSchema::create('pixels', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('user_id')->nullable();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->smallInteger('x');
$table->smallInteger('y');
$table->string('color', 18);
$table->timestamps();
$table->index('id');
});
При каждом клике на стороне клиента, информация записывается в таблицу и разносится по подключенным клиентам.
Вопрос: как при открытии сайта, быстрее и эффективнее всего отобразить полотно со всеми пикселями из БД?
Как сейчас реализовано
Загрузка по чанкам: при открытии сайта делает N ajax запросов к апи, который возвращает чанк с пикселями. Использовал вариант с offset-limit
, с where id > N and where id < N
, эффект одинаковый.
Еще проблема в том, что запросы занимают большое кол-во времени, при этом блокируя другие открытые вкладки которые ждут пока завершатся предыдущие запросы с других вкладок (nginx php-fpm, очевидно завершать запросы, чтобы принять следующие плохая идея, т. к. нагрузка на сервер в эти моменты и так растет, а ожидаемое кол-во одновременно подключенных клиентов десятки тысяч (*в моих влажных мечтах)).
Вообще, идея с подобным подходом мне вообще не нравится, и я понимаю что это неправильно.
Может у вас есть идеи как подобное можно реализовать? И годится ли MySQL для таких целей?