Хранение небольших изображений как данных BLOB-объектов в MySQL - PullRequest
0 голосов
/ 11 октября 2018

Я читал о хранении данных больших двоичных объектов в таблицах несколько лет назад и подумал, что хранить изображения для сообщений в блоге было фантастической идеей, но после прочтения огромного количества негативных моментов, касающихся их влияния на время выполнения страницы, я был уволенit.

В конце концов я создал систему загрузки php для BLOB-объектов, и, просмотрев данные для нескольких загруженных мной изображений, я увидел, как растущее число изображений может в конечном итоге вызвать проблему.

Однако при загрузке небольших изображений (120px x 120px) в ячейке данных BLOB-объектов получается довольно короткое количество символов, примерно столько же, сколько в короткой новостной статье, которую я написал бы для новостной ленты своих сайтов.

Итак,как обстоят дела с данными BLOB-объектов?Действительно ли это замедляет работу базы данных, и какого размера это становится проблемой?Я хотел бы создать миниатюру размером 120 x 120 для каждого сообщения, но не хочу загружать физический файл.

1 Ответ

0 голосов
/ 11 октября 2018

Причина сохранения ваших изображений вне базы данных, независимо от их размера, не в том, что сам поиск изображений особенно замедляет работу базы данных.Вместо этого это потому, что это заставляет вашу базу данных и веб-приложение выполнять дополнительную, ненужную работу.

Когда пользователь запрашивает изображение, ваше веб-приложение (php или любой другой язык) должно использовать SELECT для получения информации избазы данных, а затем отправить его в браузер пользователя.Это дополнительная работа для веб-приложения и базы данных.Если вы отправите страницу с пятью изображениями, вашему веб-приложению придется обрабатывать шесть запросов из браузера, а не один. Это причина замедления.

Обычно веб-страница с изображениями в браузере выглядит примерно так:

 <p>blah blah blah</p>
 <div><img src="/images/thumbnails/0045.jpg" width="120" height="120" /></div>
  (etc)

Ваше веб-приложение получаетзапрос и собирает и доставляет страницу html.Веб-браузер анализирует страницу, отображает ее и находит все теги <img />.Затем браузер отправляет еще один запрос в ваше веб-приложение для каждого найденного изображения .Для обработки этих запросов изображений ваше веб-приложение должно обрабатывать отдельный запрос от браузера для каждого изображения.При обработке каждого из этих запросов ваш код должен затем выполнить другой запрос SELECT, получить запрошенное изображение из базы данных и отправить его в браузер.

Итак, SELECT, который вы делаете для доставки страницы, ненужен блоб изображения и не может его использовать.SELECT, которые вы делаете для получения изображений, вероятно, не могут использовать столбцы, содержащие html-контент.

Эти дополнительные запросы к вашему веб-приложению являются проблемой, вызванной хранением изображений в таблице.(Кроме того, большинству систем dbms, включая MySQL, приходится выполнять дополнительную работу по извлечению BLOB-объектов.)

И вашему веб-приложению приходится иметь дело с заголовками для управления кэшированием, типом контента и т. Д.,Это дополнительное бремя программирования и тестирования.

Изображения, даже миниатюры, являются статичными.Веб-серверы, такие как apache и nginx, чрезвычайно оптимизированы для доставки их в браузеры непосредственно из файловой системы вашего сервера.(Серверы отображают в памяти файл, а затем просто записывают эту память в исходящий HTTP-сокет одним вызовом send.) И, если ваше приложение расширяется, вы можете использовать сеть доставки контента (например, Cloudflare) для доставки статических изображений.быстро для большого числа пользователей.

Вам необходимо управлять изображениями в файловой системе и указать веб-серверу, где их получить.В материале, который вы читали об изображениях и базах данных, есть несколько предложений для этого.

Если на определенных страницах вашего контента есть неизменные миниатюры, вы можете рассмотреть возможность встраивания изображений непосредственно в html страниц.используя URL-адреса данных .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...