Какую выгоду получает таблица InnoDB от строк фиксированной длины? - PullRequest
1 голос
/ 23 мая 2010

Я знаю, что в зависимости от используемого механизма хранения базы данных выигрыш в производительности можно получить, если гарантируется одинаковая длина всех строк в таблице (избегая пустых столбцов и не используя VARCHAR, TEXT или BLOB столбцы). Мне не ясно, насколько это относится к InnoDB, с его забавными столами. Давайте приведем пример: у меня есть следующая таблица

CREATE TABLE `PlayerGameRcd` (
    `User` SMALLINT UNSIGNED NOT NULL,
    `Game` MEDIUMINT UNSIGNED NOT NULL,
    `GameResult` ENUM('Quit',
                      'Kicked by Vote',
                      'Kicked by Admin',
                      'Kicked by System',
                      'Finished 5th',
                      'Finished 4th',
                      'Finished 3rd',
                      'Finished 2nd',
                      'Finished 1st',
                      'Game Aborted',
                      'Playing',
                      'Hide'
                      ) NOT NULL DEFAULT 'Playing',
    `Inherited` TINYINT NOT NULL,
    `GameCounts` TINYINT NOT NULL,
    `Colour` TINYINT UNSIGNED NOT NULL,
    `Score` SMALLINT UNSIGNED NOT NULL DEFAULT 0,
    `NumLongTurns` TINYINT UNSIGNED NOT NULL DEFAULT 0,
    `Notes` MEDIUMTEXT,
    `CurrentOccupant` TINYINT UNSIGNED NOT NULL DEFAULT 0,
    PRIMARY KEY (`Game`, `User`),
    UNIQUE KEY `PGR_multi_uk` (`Game`, `CurrentOccupant`, `Colour`),
    INDEX `Stats_ind_PGR` (`GameCounts`, `GameResult`, `Score`, `User`),
    INDEX `GameList_ind_PGR` (`User`, `CurrentOccupant`, `Game`, `Colour`),
    CONSTRAINT `Constr_PlayerGameRcd_User_fk`
        FOREIGN KEY `User_fk` (`User`) REFERENCES `User` (`UserID`)
        ON DELETE CASCADE ON UPDATE CASCADE,
    CONSTRAINT `Constr_PlayerGameRcd_Game_fk`
        FOREIGN KEY `Game_fk` (`Game`) REFERENCES `Game` (`GameID`)
        ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=INNODB CHARACTER SET utf8 COLLATE utf8_general_ci

Единственный столбец, который может иметь значение NULL, это Notes, то есть MEDIUMTEXT. Эта таблица в настоящее время имеет 33097 строк (что я пока оцениваю как небольшое). Из этих строк только 61 имеет значения в Notes. Какое улучшение я могу видеть, скажем, добавление новой таблицы для хранения столбца Notes и выполнение LEFT JOINs при необходимости?

1 Ответ

1 голос
/ 24 мая 2010

Поля текста и BLOB-объектов хранятся отдельно от таблицы (что требует дополнительного поиска значения на диске). Каждый раз, когда для подзапроса из таблицы потребуется временная таблица, временная таблица будет немедленно создана на диске, поскольку mysql не может предсказать размер строки и зарезервировать достаточно места в памяти.

Если размер вашего поля Notes не превышает 64 КБ, я бы рекомендовал использовать VARCHAR. Если содержимое примечаний никогда не будет превышать 1000 символов, используйте VARCHAR (1000).

...