Каков оптимум varchar размеры для MySQL?

Насколько я могу судить, вы действительно правы, это выглядит как «ошибка» , хотя, честно говоря, это недавно изменилось с дефектом CWG 1213 , в котором говорится:

Поскольку операция субтипирования определяется как косвенное наведение по значению указателя, результат оператора индекса, применяемого к массиву xvalue, является значением lvalue, а не значением x. Это может быть удивительно для некоторых.

blockquote>

, и это изменило раздел 5.2.1 [expr.sub] следующим образом:

Постфиксное выражение, за которым следует выражение в квадратных скобках - постфиксное выражение. Одно из выражений должно иметь тип «массив Т» или «указатель на Т», а другой должен иметь неперечисленное перечисление или интегральный тип. Результатом является lvalue типа «T». Тип «T» должен быть полностью определенным типом объекта.62 Выражение E1 [E2] идентично (по определению) к * ((E1) + (E2)) [ Примечание: см. 5.3 [expr.unary] и 5.7 [expr.add] для получения подробных сведений о * и + и 8.3.4 [dcl.array] для получения подробной информации о массивах. -End note], за исключением того, что в случае операнда массива результат равен lvalue, если этот операнд является lvalue и xvalue иначе.

blockquote>

Так что действительно результат f().a[0]; и static_cast(s).a[0] должны быть x значениями.

У этого дефекта не было предлагаемой резолюции до декабря 2012 года, а поддержка отчета о дефектах clangs перечисляет поддержку этого отчета о дефектах как неизвестную, поэтому, скорее всего, разработчики не получили исправления

Обновить

Подано сообщение об ошибке clang : Оператор подстроки, примененный к временному массиву, приводит к lvalue .

66
задан ae. 20 July 2009 в 04:30
поделиться

2 ответа

Чтобы ответить на вопрос, на диске MySql используется 1 + размер, который используется в поле для хранения данных (поэтому, если столбец был объявлен как varchar (45), а поле было «FooBar», он будет использовать 7 байтов). на диске, если, конечно, вы не используете многобайтовый набор символов, где он будет использовать 14 байтов). Таким образом, как бы вы ни объявили свои столбцы, это не будет иметь никакого значения для хранилища (вы заявили, что беспокоитесь об оптимизации диска для массивной таблицы). Тем не менее, это имеет значение в запросах, поскольку VARCHAR преобразуются в CHAR, когда MySql создает временную таблицу (SORT, ORDER и т. Д.), И чем больше записей вы можете разместить на одной странице, тем меньше памяти и быстрее будет сканироваться таблица. быть.

56
ответ дан Kris Erickson 7 November 2019 в 11:17
поделиться

MySQL хранит поле varchar как запись переменной длины с однобайтовым или двухбайтовым префиксом для указания размера записи.

Наличие шаблона размеров памяти не означает ' Это действительно имеет значение для того, как MySQL будет работать с хранилищами записей переменной длины. Длина, указанная в объявлении varchar (x), просто определяет максимальную длину данных, которые могут быть сохранены. По сути, varchar (16) по диску не отличается от varchar (128).

На этой странице руководства есть более подробное объяснение.

Edit: Что касается вашего обновленного вопроса, ответ следующий: все такой же. Поле varchar будет использовать столько места на диске, сколько хранящиеся в нем данные (плюс один или два байта накладных расходов). Так что не имеет значения, есть ли у вас varchar (16) или varchar (128),

24
ответ дан 24 November 2019 в 15:06
поделиться
Другие вопросы по тегам:

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