Столбцы хранятся как часть их строки.Строки хранятся как часть страницы.Если вам нужен один столбец из одной строки, вам нужно прочитать всю строку, фактически вы читаете всю страницу, в которой находится эта строка. Это могут быть тысячи строк, включая все их столбцы.Надеемся, что на этой странице есть и другие интересующие вас строки, и чтение не теряется.
Именно поэтому базы данных Columnar становятся настолько популярными для аналитики.Они хранят столбцы отдельно.Они по-прежнему хранят значения в страницах.Таким образом, вы читаете тысячи строк с диска для этого столбца, но в аналитике вас, вероятно, заинтересуют все или большинство этих строк.Таким образом, вы можете иметь сотни столбцов, но только когда-либо читаете запрашиваемые столбцы.
MySQL не имеет ColumnStore.Итак, вам нужна альтернатива.
Во-первых, большие поля должны находиться в отдельной таблице, на которую вы уже ссылались.
Во-вторых, вы можете использовать индекс покрытия.
Если вы индексируете (file_extension, book_id)
, запрос SELECT book_id FROM book WHERE file_extension = 'pdf'
может быть удовлетворен, просто читая индекс.Ему никогда не нужно читать саму таблицу. (индексы по-прежнему хранятся в виде страниц на диске, но только столбцы, к которым относится индекс, и, возможно, указатель строки. Гораздо уже, чем таблица.)
Хотя это немного неуклюжепотому что индекс покрытия должен охватывать интересующие вас столбцы.
На практике ваши поля достаточно малы, чтобы не требовать этого внимания, пока это не станет проблемой.Было бы разумно хранить BLOB
s в отдельной таблице.