Я знаю, что в зависимости от используемого механизма хранения базы данных выигрыш в производительности можно получить, если гарантируется одинаковая длина всех строк в таблице (избегая пустых столбцов и не используя 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 при необходимости?