В чем разница между типами данных MySQL и текстовыми данными?

dba.stackexchange https://dba.stackexchange.com/questions/386

Вопрос

После версии 5.0.3 (которая позволила VARCHAR составлять 65 535 байтов и остановленные усеченные сцепные пространства), существует ли какое -либо важное различие между этими двумя типами данных?

Я читал Список различий И единственные два заметки:

Для индексов на Blob и текстовых столбцах необходимо указать длину префикса индекса. Для char и varchar длина префикса является необязательной. См. Раздел 7.5.1, «Индексы столбцов».

а также

Капля и текстовые столбцы не могут иметь значения по умолчанию.

Итак, из -за этих двух ограничений на текстовом данных, зачем вам использовать его по Varchar (65535)? Существуют ли результаты эффективности одного над другим?

Это было полезно?

Решение

разделенный Связанная с какой -то информацией, которая объясняет основную проблему (есть различия в производительности), но это не достаточно просто, чтобы сказать, что один всегда лучше, чем другой. (В противном случае, не будет никаких оснований иметь и то, и другое.) Кроме того, в Myism максимальный размер 64K для VARCHAR не для поля - это за запись.

По сути, есть 4 способа хранения строк в записях базы данных:

  1. фиксированная длина
  2. Строки C-Style (отмечены нулевым или подобным символом в конце строки)
  3. Строки в стиле Паскаля (несколько байтов, чтобы указать длину, затем строка)
  4. Указатели (храните строку где -то еще)

Myism использует что -то похожее на #3 для Varchar, и гибридный подход для текста, где он хранит начало строки в записи, а затем остальная часть строки где -то еще. InnoDB похож на VARCHAR, но хранит полное текстовое поле за пределами записи.

С 1 и 4 материал в записи всегда одинакова, поэтому проще пропустить, если вам не нужна строка, но вам нужны вещи после нее. И #2, и #3 не так уж и плохи для коротких струн ... #2 должны продолжать искать маркер, а № 3 может пропустить вперед ... По мере того, как строки становятся длиннее, #2 ухудшается для этого конкретного использования кейс.

Если вам действительно нужно прочитать строку, #4 медленнее, так как вам нужно читать запись, затем прочитайте строку, которая может храниться в другом месте на диске, в зависимости от того, как эта база данных обрабатывает ее. #1 всегда довольно прост, и опять же, вы сталкиваетесь с подобными проблемами, когда для #2 становится хуже, чем дольше, а строка, в то время как № 3 немного хуже, чем #2 для очень маленьких струн, но лучше, по мере того, как она становится длиннее.

Тогда есть требования к хранению ... #1 всегда является фиксированной длиной, так что это может быть разматывается, если большинство строк не максимально не имеют максимальной длины. #2 имеет 1 дополнительный байт; #3 Обычно имеет 2 дополнительных байта, если максимальная длина = 255, 4 дополнительных байта, если максимум 64K. #4 имеет длину указателя, плюс правила для #3 обычно.

Для конкретных реализаций в MySQL 5.1 Документы для миссии:

  • Поддержка истинного типа варчара; Колонница varchar начинается с длины, хранящейся в одном или двух байтах.
  • Таблицы с столбцами VARCHAR могут иметь фиксированную или динамическую длину строки.
  • Сумма длины столбцов варчара и символа в таблице может составлять до 64 КБ.

Пока для Innodb :

  • Часть переменной длины заголовка записей содержит вектор бита для указания нулевых столбцов. Если количество столбцов в индексе, которые могут быть нулевыми, составляет n, бит вектор занимает байт потолка (N/8). (Например, если есть от 9 до 15 столбцов, которые могут быть нулевыми, бит вектор использует два байта.) Столбцы, которые являются нулевыми, не занимают пространство, кроме бита в этом векторе. Часть переменной длины заголовка также содержит длины столбцов переменной длины. Каждая длина занимает один или два байта, в зависимости от максимальной длины столбца. Если все столбцы в индексе не являются нулевыми и имеют фиксированную длину, заголовок записи не имеет части переменной длины.
  • Для каждого не нулевого поля переменной длины заголовок записи содержит длину столбца в одном или двух байтах. Два байта будут необходимы только в том случае, если часть столбца хранится извне на страницах переполнения, или максимальная длина превышает 255 байтов, а фактическая длина превышает 127 байтов. Для извне хранится столбец, длина двух байтов указывает на длину внутренней хранимой части плюс 20-байтовый указатель на внешне хранимую часть. Внутренняя часть составляет 768 байтов, поэтому длина 768+20. 20-байтовый указатель хранит истинную длину столбца.

...

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

Другие советы

Когда выбор должен создать временную таблицу (например, для сортировки результатов), он создаст либо таблицу памяти, либо таблицу Myisam. Память более эффективна. Есть ограничения на память - один из них - запретить текст и каплю. Следовательно, выбор май Запустите медленнее с текстом, чем varchar.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top