Действительно ли varchar 2 более эффективен, чем varchar 255?

Я использую Django и устанавливаю мой CharField (max_length=255), даже при том, что я только намереваюсь использовать приблизительно 5 символов. Действительно ли это менее эффективно? Я считал, что это действительно не имеет значения с varchar, но тогда считать, что сохранит пространство на жестком диске для определения только, в чем Вы нуждаетесь.

10
задан John Stauffer 13 January 2010 в 09:45
поделиться

5 ответов

В целом, варчар(255) требует столько же хранения, сколько и варчар(1). В каждом случае таблица хранит что-то вроде указателя в строковой таблице и длину. Например, смещение в 4 байта + размер 1 байта = 5 байт в строке, только для накладных расходов.

Реальное содержимое, конечно же, находится в строковой таблице, а это только длина строки, в которой хранится ваше хранилище. Таким образом, если вы храните имя из 5 букв в поле varchar(255), то оно будет использовать (скажем) только 5 накладных байт + 5 байт содержимого = 10 байт.

При использовании поля varchar(10) будет использовано точно такое же количество, но будут использоваться только усеченные строки длиннее 10 байт.


Конечно, конкретные числа зависят от реализации механизма хранения данных.

12
ответ дан 3 December 2019 в 19:33
поделиться
- [11152514-

A VARCAR не займет больше места, чем в строке, в которой вы храните в нее, кроме накладных отложений для хранения длины строки :

+------------------------------------------+---------------------------------+
| Value      | CHAR(4)    Storage Required | VARCHAR(4)   Storage Required   |  
+------------+-----------------------------+---------------------------------+
| ''         | '    '     4 bytes          | ''           1 byte             |
| 'ab'       | 'ab  '     4 bytes          | 'ab'         3 bytes            | 
| 'abcd'     | 'abcd'     4 bytes          | 'abcd'       5 bytes            |
| 'abcdefgh' | 'abcd'     4 bytes          | 'abcd'       5 bytes            |
+------------+-----------------------------+---------------------------------+

Однако, если вы Действительно требуется только 5 символов, затем рассмотрим использование CHAR (5), если в таблице нет других переменных ширины в таблице (т. Е. Варечаны, текст или капли). Тогда у вас будет фиксированная запись длины, которая выполняет некоторые преимуществ производительности :

для таблиц MyISAM, которые меняются Часто вы должны попытаться избежать Все столбцы переменной длины (varchar, Blob и текст). Таблица использует Формат динамического строки, если он включает в себя даже один столбец переменной длины. Видеть Глава 13, Двигатели хранения.

5
ответ дан 3 December 2019 в 19:33
поделиться

Вместо того, чтобы использовать большое пространство излишне, используйте пространство, которые не только дают вам больше места хранения, но также и быструю скорость выполнения, поскольку это не должно было читать все символы. Если вы выделите varchar (255) и добавите текст 'abc', то Это считает символ, 'b', 'c' и другой как пространство.

Так, всегда используйте пространство u требуемый вместо того, чтобы сохранить макс. пространство.

0
ответ дан 3 December 2019 в 19:33
поделиться

Жесткий диск дешевый, но кэш-память CPU дорогая. Можно поместить больше маленьких полей, чем больших.

1
ответ дан 3 December 2019 в 19:33
поделиться

Эта ошибка возникает из-за попытки сравнить $ _ REQUEST ['c'] с чем-либо, если $ _ REQUEST ['c'] не существует.

Решение состоит в использовании isset () перед сравнением. Это приведет к удалению предупреждения, поскольку сравнение не будет выполнено, если $ _ REQUEST ['c'] не существует.

if(isset($_REQUEST['c']) && $_REQUEST['c']!="")
{
 $pidis=(int)($_REQUEST['c']);
}

Это ошибка уровня E _ NOTICE , и ваш уровень отчетов об ошибках повлияет на то, отображается ли ошибка или нет. На сервере клиента включен отчет об ошибках уровня E _ NOTICE , поэтому он отображается там.

Рекомендуется всегда разрабатывать с помощью E _ ALL , чтобы можно было уловить ошибку такого рода перед переносом кода на другие серверы.

-121--2756998-

Вы можете создать что-то вроде коллекции Google Java Multimap ... или вы можете просто добавить такой метод расширения:

public static void AddValue<TKey, TValue>
    (this IDictionary<TKey, List<TValue>> dictionary, TKey key, TValue value)
{
    List<TValue> values;
    if (!dictionary.TryGetValue(key, out values))
    {
        values = new List<TValue>();
        dictionary.Add(key, values);
    }
    values.Add(value);
}

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

-121--3926414-

Одна из предупреждений об использовании char вместо varchar заключается в том, что набор символов влияет на пространство, которое должно быть выделено. Например, если набор символов для этого столбца равен utf8, то возможно, что для хранения одного символа потребуется 3 байта.

Поскольку столбец char приводит к выделению фиксированного размера независимо от сохраненного, база данных должна соответствовать наихудшему варианту. Таким образом, MySQL должен всегда выделять 15 байт на строку для этого столбца char (5), даже если вы на самом деле храните только 5 однобайтовых символов в каждой строке.

Varchar использует только то, что необходимо для каждой строки, так что те же самые 5 однобайтовые символы занимают только 6 или 7 байт. Дополнительные байт или два предназначены для отслеживания фактической длины. Для вархара шириной до 255 в однобайтовом наборе символов MySQL необходимо выделить только 1 байт для хранения фактической ширины. Варчар ширины, 256 65 535, требует 2 байтов для хранения длины, предполагая однобайтовый набор символов.

Поскольку utf8 varchar (255) может потребовать 255 * 3 байт места хранения, MySQL должен выделить 2 байт для хранения длины. Большая часть этой информации содержится в документах MySQL здесь .

Хотя можно объявить ширину 65 535, максимальный эффективный размер в байтах будет 65 532. Однако, в зависимости от набора символов и сохраняемых символов, можно хранить не более чем несколько многобайтовых символов.

Однако, как указывает Пол, вы все еще можете использовать символ, если это позволит всей строке быть фиксированной ширины. Помимо прочего, некоторые поиски могут быть более быстрыми (например, пропускать первые 1000 строк) из-за фиксированного смещения.

Также существуют проблемы с производительностью, которые необходимо учитывать при обновлении столбца. Если у вас есть символ (5)и начать с 1 символа, а затем обновить значение до 5 символов, строка может быть обновлена на месте. С варчаром, в зависимости от реализации механизма места хранения, может потребоваться переписать всю строку в новом месте.

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

2
ответ дан 3 December 2019 в 19:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: