В последнее время мне нужно добавить поле в таблицу.В то же время я чувствую, что создание таблицы на раннем этапе немного грубо, и нет никаких ограничений.Например, длина некоторых строк ограничена , и поля не ограничены при создании таблицы. Поэтому я хочу оптимизировать поля таблицы, добавив поля в этот раз.Перед оптимизацией я прочитал некоторые теоретические знания, а теория направляет практику.
написать впереди
Выбор подходящего типа поля может сэкономить место и повысить эффективность запросов, поэтому выбор типа поля очень важен. В этой статье будут представлены общие типы полей:
- Целочисленный тип
- реальный тип
- Тип строки
- Дата и время
- тип перечисления
Целочисленный тип
Целочисленные типы включают TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT, пространство для хранения и диапазон значений:
тип | Место для хранения (в битах) | Диапазон значений |
---|---|---|
TINYINT | 8 | -128 ~ 127 |
SMALLINT | 16 | -32768 ~ 32767 |
MEDIUMINT | 24 | -8388608 ~ 8388607 |
INT | 32 | -2147483648 ~ 2147483647 |
BIGINT | 64 | слишком большой |
Диапазон значений: -2^(N-1) ~ 2^N, где N — размер дискового пространства.
Целочисленные типы имеют необязательное свойство UNSIGNED, запрещающее отрицательные значения. Установка свойства UNSIGNED может удвоить верхний предел положительных чисел, а диапазон значений составляет 0 ~ 2 ^ (N-1) + 2 ^ N.
в целомвыбрать самый маленькийТип, который может удовлетворить требованиям хранилища, подходит, а меньший тип данных обычноБыстрее, занимает меньше места на диске, в памяти и в кеше процессора. Это также требует меньше циклов процессора для обработки
реальный тип
FLOAT
С плавающей запятой одинарной точности, используя 8 бит
DOUBLE
Двойная точность с плавающей запятой с использованием 16-битной памяти
DECIMAL
Потеря точности произойдет, если для вычисления используются float и double.Причины потери точности можно найти в этой статье:Босс, почему я должен вычитать свою зарплату за то, что храню сумму в плавающем состоянии?Когда требуется точное вычисление, можно использовать DECIMAL.Дополнительное пространство и вычислительные затраты, поэтому используйте тогда и только тогда, когда требуется точное вычисление
Тип строки
1. ВАРЧАР и ЧАР
varchar и char — очень, очень часто используемые строковые типы.
VARCHAR
VARCHAR используется для хранения строк переменной длины.При использовании этого типа для хранения строк вам нужно использовать 1 или 2 дополнительных байта для записи длины строки:
- Максимальная длина столбца меньше или равна 255 => используется 1 байт
- Длина столбца больше 255 => использовать 2 байта
Сценарии, в которых в качестве типа хранилища используется VARCHAR:
- Несколько обновлений столбцов => частые обновления столбцов склонны к разбиению страниц
- Длина столбца не фиксирована => VARCHAR использует только необходимое пространство при сохранении, поэтому это сэкономит место
CHAR
CHAR используется для хранения строк фиксированной длины, при сохранении типов CHAR все завершающие пробелы будут удалены.
Сценарии, в которых CHAR является наиболее часто используемым типом хранения
- Колонны имеют почти фиксированную длину
- Длина столбца короткая => VARCHAR нужны дополнительные байты для хранения длины
- Столбцы часто обновляются
2. Типы BLOB и TEXT
Оба типа BLOB и TEXT используются для хранения больших данных, таких как содержание статей.
BLOB
Хранится в двоичном режиме, подразделение BLOB может быть разделено на TINYBLOB, SMALLBLOB, BLOB, MEDIUMBLOB, LONGBLOB.
TEXT
Используя хранилище символов, подразделение TEXT можно разделить на TINYTEXT, SMALLTEXT, TEXT, MEDIUMTEXT, LONGTEXT.
Когда значения BLOB и TEXT слишком велики, хранилище InnoDB будет использовать область внешнего хранилища для хранения значения, а затем сохранит 1-4-байтовый указатель на внешнее хранилище.
тип даты и времени
Обычно используемые типы даты: DATETIME и TIMESTAMP.
DATETIME
Используя 8-байтное хранилище, можно хранить широкий диапазон значений, от 1001 до 9999.
TIMESTAMP
Используйте 4 байта хранилища, диапазон хранения меньше, чем DATETIME, от 1970 до 2038.
DOUBLE или BIGINT можно использовать для дат и времени, которые необходимо хранить с меньшей степенью детализации, конечно, BIGINT также можно использовать вместо хранения с небольшой степенью детализации.
Как выбрать DATETIME и TIMESTAMP
Раньше были медленные онлайн-запросы из-за типа времени. В этой статье описаны причины медленных запросов:очень счастлив! Наконец-то ступил на яму медленного запроса, BIGINT рекомендуется для поиска временного диапазона, сортировки, группировки и других операций. Если нет операции для полей типа времени, рекомендуется использовать TIMESTAMP. Вы можете обратиться к этой статье:Сравнение эффективности запросов типов времени базы данных mysql datetime, bigint и timestamp
Найдено в stackoverflow следующим образом:
тип перечисления
Вы можете использовать столбцы перечисления вместо обычных типов строк, и вы можете ограничить диапазон значений через перечисление
использование перечисления
Оператор создания таблицы:
CREATE TABLE `dataset_enum` (
`name` varchar(48) DEFAULT NULL,
`status` enum('NEW','UPLOADING','USING','DELETING') DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
Вставить заявление:
insert into dataset_enum(name, status) values("t4", "DELETING")
Для нижнего слоя поля состоянияцелые числа хранятсявместо струн под капотом будетподдерживать отображение числовой строки
Оператор запроса и сортировка по полю статуса:
select * from dataset_enum order by status;
результат поиска:
+------+-----------+
| name | status |
+------+-----------+
| t1 | NEW |
| t2 | UPLOADING |
| t4 | DELETING |
+------+-----------+
инструкция:
- Результат сортировки основан на целых числах, хранящихся внутри, а не на определенных строках.
- Базовое хранилище представляет собой целое число, которое преобразуется в строку в соответствии с отношением отображения, поэтому оно будетЕсть определенная стоимость
Зачем использовать TINYINT вместо ENUM
Когда таблица создавалась раньше, для замены общих строк выбирался тип TINYINT, а преобразование выполнял прикладной уровень. Когда я увидел тип ENUM, я был немного сбит с толку. Почему я выбрал не ENUM, а TINY? Я искал причину в Интернете, как показано ниже:
Причины резюмируются следующим образом:
- Неудобно мигрировать и имеет слабую масштабируемость, например знакомая БД PostgreSQL не поддерживает тип ENUM.
- При добавлении или удалении строк в поле ENUM таблица будет перестроена, что требует больших затрат времени и производительности.
- есть яма
Возьмите предыдущую таблицу dataset_enum в качестве примера для вставки данных:
Данные успешно вставлены Данные запроса:mysql> insert into dataset_enum values("t1", "NEW"), ("t2", 2); Query OK, 2 rows affected (0.01 sec) Records: 2 Duplicates: 0 Warnings: 0
Числовые типы также могут быть вставлены после преобразованияmysql> select * from dataset_enum; +------+-----------+ | name | status | +------+-----------+ | t1 | NEW | | t2 | UPLOADING | +------+-----------+
- Невозможно связать с другими таблицами
Справочная статья:
Should I use the datetime or timestamp data type in MySQL?
8 Reasons Why MySQL's ENUM Data Type Is Evil
Почему так много людей предпочитают использовать tinyint вместо enum?
«Высокопроизводительный MySQL»