Как правило, быстрее читать из таблицы, где нет данных varchar или другой переменной длины? В MySQL это происходит быстрее, потому что он может точно рассчитать, где строка будет храниться на диске.Быстрее ли читать столбцы фиксированной ширины в SQLite?
ответ
Этот вопрос не имеет смысла в контексте SQLite, поскольку он поддерживает только один тип поля TEXT
. Различия «фиксированной ширины» и «переменной длины» здесь не существует.
Хотя SQLite позволит вам определить, что поле имеет определенный тип, все это делает (самое большее) задает предпочтение этого поля для типа, используемого при хранении неоднозначных данных (например, будет ли «3» сохранено как INTEGER, REAL или TEXT). Вы все равно можете хранить любые данные в любом SQLite-поле независимо от его типа.
В частности, относящиеся к CHAR против VARCHAR, http://www.sqlite.org/datatype3.html говорит нам:
Если объявленный тип столбца содержит любой из строк «CHAR», «CLOB », или «TEXT», то, что column имеет TEXT сходство. Обратите внимание, что тип VARCHAR содержит строку «CHAR» и , таким образом, присваивает TEXT-сродство.
Только с SQLite uses variable-length records, я бы предположил, что они не реализовали оптимизацию поиска по ширине, когда строки имеют одинаковую длину.
И как указал Дейв, все еще можно хранить текст в полях INT. Начиная с SQLite never truncates data, это означает, что SQLite разрешает, по-видимому, фиксированный столбец ширины, например INT, для хранения данных переменной длины. Таким образом, невозможно реализовать оптимизацию поиска по фиксированной ширине.
Но я мог бы также удалить все столбцы text/varchar/char из таблицы. Тогда будет фиксированная ширина. Мои вопросы касаются того, позволит ли это ускорить поиск столбца (кроме его небольшого размера). – David
Нет, это не так. Как поясняется связанным документом, SQLite использует динамические типы полей. Даже если вы объявляете поле INTEGER, вы все равно можете хранить в нем поплавки, текст или даже капли. Объявление «INTEGER» дает этому полю предпочтение хранить данные как целые числа, но не ограничивает его. Он все равно будет столбцом/записью переменной ширины. (И это даже игнорирует детали, что INTEGER не имеет фиксированного размера в SQLite) –