Снизить скорость роста индекса в MySQL - PullRequest
0 голосов
/ 16 сентября 2018

На моем сервисе https://simibat.ru/fftracker У меня есть несколько таблиц «многие ко многим» (например, для достижений персонажей), которые состоят из 2 столбцов с внешним ключом (одна из них также является составным первичным ключом)и 3-й столбец с датами или что-то еще актуальным.В примере таблицы достижений в нем содержится более 36 миллионов строк, приблизительно 1 ГБ общего размера с индексом чуть ниже 500 МБ.Ничего особенного, я знаю.Меня беспокоит скорость роста индекса.

Примерно через неделю индекс получает как минимум ~ 400 дополнительных МБ, для ~ 10 МБ (максимум) реальных новых данных.После оптимизации таблицы эти 400 МБ превращаются в ~ 5 МБ.Не так уж и сложно запускать оптимизацию каждую неделю, но мне любопытно, есть ли способ снизить столь значительный (и бессмысленный) темп роста, поскольку это, кажется, правильный подход.

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

Итак, есть идеи, как я могу подойти к этому?

Обновление Еще одна вещь, на которую следует обратить внимание: я использую INSERT ... ON DUPLICATE KEY UPDATE.Может быть, это обновляет индекс, что приводит к его росту?

CREATES таблиц в соответствии с запросом.Таблица, с которой я имею дело, называется ff__character_achievement (junctions), остальные в основном для справки (на всякий случай).

   CREATE TABLE `ff__character_achievement` (
     `characterid` int(10) unsigned NOT NULL,
     `achievementid` smallint(5) unsigned NOT NULL,
     `time` date NOT NULL,
     PRIMARY KEY (`characterid`,`achievementid`),
     KEY `ach` (`achievementid`) USING BTREE,
     CONSTRAINT `char_ach_ach` FOREIGN KEY (`achievementid`) REFERENCES `ff__achievement` (`achievementid`) ON DELETE CASCADE ON UPDATE CASCADE,
     CONSTRAINT `char_ach_char` FOREIGN KEY (`characterid`) REFERENCES `ff__character` (`characterid`) ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

CREATE TABLE `ff__achievement` (
     `achievementid` smallint(5) unsigned NOT NULL,
     `name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL,
     `category` varchar(30) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
     `subcategory` varchar(30) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
     `icon` varchar(150) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
     `howto` text COLLATE utf8mb4_unicode_ci,
     `points` tinyint(3) unsigned DEFAULT NULL,
     `title` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
     `item` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
     `itemicon` varchar(150) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
     `itemid` varchar(15) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
     PRIMARY KEY (`achievementid`),
     KEY `name` (`name`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

    CREATE TABLE `ff__character` (
     `characterid` int(10) unsigned NOT NULL,
     `userid` int(10) unsigned DEFAULT NULL,
     `serverid` tinyint(2) unsigned NOT NULL,
     `name` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,
     `updated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
     `freecompanyid` bigint(20) unsigned DEFAULT NULL,
     `biography` text COLLATE utf8mb4_unicode_ci,
     `titleid` smallint(5) unsigned DEFAULT NULL,
     `bio_avatar` varchar(66) COLLATE utf8mb4_unicode_ci NOT NULL,
     `clanid` tinyint(2) unsigned NOT NULL,
     `genderid` tinyint(1) unsigned NOT NULL,
     `namedayid` smallint(3) unsigned NOT NULL,
     `guardianid` tinyint(2) unsigned NOT NULL,
     `cityid` tinyint(1) unsigned NOT NULL,
     `fc_rankidprev` tinyint(2) unsigned DEFAULT NULL,
     `fc_rankid` tinyint(2) unsigned DEFAULT NULL,
     `fc_ranklvlupd` timestamp NULL DEFAULT NULL,
     `fc_nextprom` text COLLATE utf8mb4_unicode_ci,
     `gcrankid` tinyint(2) unsigned DEFAULT NULL,
     `Alchemist` tinyint(3) unsigned DEFAULT NULL,
     `Armorer` tinyint(3) unsigned DEFAULT NULL,
     `Astrologian` tinyint(3) unsigned DEFAULT NULL,
     `Bard` tinyint(3) unsigned DEFAULT NULL,
     `BlackMage` tinyint(3) unsigned DEFAULT NULL,
     `Blacksmith` tinyint(3) unsigned DEFAULT NULL,
     `Botanist` tinyint(3) unsigned DEFAULT NULL,
     `Carpenter` tinyint(3) unsigned DEFAULT NULL,
     `Culinarian` tinyint(3) unsigned DEFAULT NULL,
     `DarkKnight` tinyint(3) unsigned DEFAULT NULL,
     `Dragoon` tinyint(3) unsigned DEFAULT NULL,
     `Fisher` tinyint(3) unsigned DEFAULT NULL,
     `Goldsmith` tinyint(3) unsigned DEFAULT NULL,
     `Leatherworker` tinyint(3) unsigned DEFAULT NULL,
     `Machinist` tinyint(3) unsigned DEFAULT NULL,
     `Miner` tinyint(3) unsigned DEFAULT NULL,
     `Monk` tinyint(3) unsigned DEFAULT NULL,
     `Ninja` tinyint(3) unsigned DEFAULT NULL,
     `Paladin` tinyint(3) unsigned DEFAULT NULL,
     `RedMage` tinyint(3) unsigned DEFAULT NULL,
     `Samurai` tinyint(3) unsigned DEFAULT NULL,
     `Scholar` tinyint(3) unsigned DEFAULT NULL,
     `Summoner` tinyint(3) unsigned DEFAULT NULL,
     `Warrior` tinyint(3) unsigned DEFAULT NULL,
     `Weaver` tinyint(3) unsigned DEFAULT NULL,
     `WhiteMage` tinyint(3) unsigned DEFAULT NULL,
     PRIMARY KEY (`characterid`,`name`) USING BTREE,
     KEY `userid` (`userid`),
     KEY `char_fc` (`freecompanyid`) USING BTREE,
     KEY `genderid` (`genderid`),
     KEY `clanid` (`clanid`),
     KEY `guardianid` (`guardianid`),
     KEY `namedayid` (`namedayid`),
     KEY `cityid` (`cityid`),
     KEY `serverid` (`serverid`),
     KEY `gcrankid` (`gcrankid`),
     KEY `titleid` (`titleid`),
     KEY `fc_rankid` (`fc_rankid`),
     KEY `fc_rankidprev` (`fc_rankidprev`),
     CONSTRAINT `character_fcid` FOREIGN KEY (`freecompanyid`) REFERENCES `ff__freecompany` (`freecompanyid`) ON DELETE SET NULL ON UPDATE CASCADE,
     CONSTRAINT `cityid` FOREIGN KEY (`cityid`) REFERENCES `ff__city` (`cityid`) ON DELETE CASCADE ON UPDATE CASCADE,
     CONSTRAINT `clanid` FOREIGN KEY (`clanid`) REFERENCES `ff__clan` (`clanid`) ON DELETE CASCADE ON UPDATE CASCADE,
     CONSTRAINT `fc_rankid` FOREIGN KEY (`fc_rankid`) REFERENCES `ff__freecompany_rank` (`rankid`) ON DELETE SET NULL ON UPDATE SET NULL,
     CONSTRAINT `fc_rankidprev` FOREIGN KEY (`fc_rankidprev`) REFERENCES `ff__freecompany_rank` (`rankid`) ON DELETE SET NULL ON UPDATE SET NULL,
     CONSTRAINT `gcrankid` FOREIGN KEY (`gcrankid`) REFERENCES `ff__grandcompany_rank` (`gcrankid`) ON DELETE SET NULL ON UPDATE SET NULL,
     CONSTRAINT `genderid` FOREIGN KEY (`genderid`) REFERENCES `usersys__gender` (`genderid`) ON DELETE CASCADE ON UPDATE CASCADE,
     CONSTRAINT `guardianid` FOREIGN KEY (`guardianid`) REFERENCES `ff__guardian` (`guardianid`) ON DELETE CASCADE ON UPDATE CASCADE,
     CONSTRAINT `namedayid` FOREIGN KEY (`namedayid`) REFERENCES `ff__nameday` (`namedayid`) ON DELETE CASCADE ON UPDATE CASCADE,
     CONSTRAINT `serverid` FOREIGN KEY (`serverid`) REFERENCES `ff__server` (`serverid`) ON DELETE CASCADE ON UPDATE CASCADE,
     CONSTRAINT `titleid` FOREIGN KEY (`titleid`) REFERENCES `ff__achievement` (`achievementid`) ON DELETE SET NULL ON UPDATE SET NULL,
     CONSTRAINT `userid` FOREIGN KEY (`userid`) REFERENCES `usersys__logins` (`userid`) ON DELETE SET NULL ON UPDATE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=COMPACT
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...