MySQL LONGTEXT нумерация страниц

У меня есть сообщения таблицы, которые содержат LONGTEXT, Моя проблема в том, что я хочу получить части определенного сообщения (в основном, подкачки)

Я использую следующий запрос:

SELECT SUBSTRING(post_content,1000,1000) FROM posts WHERE id=x

Это как-то хорошо, но проблема в положении и длине. В большинстве случаев первое и последнее слово не является полным, что имеет смысл.

Как я могу получить полные слова из позиции x для длины y?

1 ответ

Предположительно, вы делаете это с целью экономии накладных расходов сетевого трафика между сервером MySQL и машиной, на которой работает ваше приложение. Как это происходит, вы не сохраняете никакой другой вид нагрузки на сервере MySQL. Он должен извлечь элемент LONGTEXT с диска, а затем запустить его через SUBSTRING,

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

Другими словами, это задача оптимизации. YAGNI? http://en.wikipedia.org/wiki/YAGNI

Если вам это нужно, вам нужно будет создать программное обеспечение для обработки слово LONGTEXT слово за словом. Лучше всего сделать это в программном обеспечении клиента. Начните с поиска первой страницы плюс ак или две статьи. Затем проанализируйте текст в поисках полных слов. После того, как вы найдете последнее полное слово на первой странице и следующие пробелы, эта позиция символа является начальной точкой для следующей страницы.

Такая задача - огромная боль в шее в хранимой процедуре MySQL. Кроме того, когда вы делаете это в хранимой процедуре, вы будете использовать циклы обработки на общем и трудно масштабируемом ресурсе (на сервере MySQL), а не на клонируемой клиентской машине.

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

Редактировать:

Замечание: гигабайт оперативной памяти сервера стоит примерно 20 долларов США. Система кэширования, такая как memcached, хорошо справляется с эффективным использованием памяти стоимостью 100 долларов США. Это достаточно для описанного вами варианта использования.

Еще одно наблюдение: многие компании, которые обслуживают крупномасштабные документы, используют файловые системы, а не СУБД для их хранения. Файловые системы могут совместно использоваться или реплицироваться между контент-серверами, и к файлам можно получить произвольный доступ без каких-либо затрат.

Немного инновационно хранить целые книги в отдельных BLOB или CLOB. Если вы можете разбить книги на какой-то сегмент - страницу? глава? кусок из тысячи слов? - и создавая отдельные строки данных для каждого сегмента, ваша СУБД будет масштабироваться НАМНОГО лучше, чем вы описали.

Если вы все равно собираетесь это сделать, вот что вы делаете:

  1. всегда извлекайте на 100 символов больше, чем нужно в каждом сегменте. Например, когда вам нужны символы 30000 - 35000, получите 30000 - 35100.

  2. после извлечения сегмента найдите первый разрыв слова в данных (кроме самого первого сегмента) и отобразите, начиная с этого слова.

  3. аналогично, найдите самое первое разбиение слова в 100 дополнительных байтах и ​​отобразите до этого разбиения слова.

Таким образом, ваши выбранные данные могут быть 30000 - 35100, а отображаемые данные - 30013 - 35048, но это будут целые слова.

Другие вопросы по тегам