Я внедрил пользовательское сокращение URL в моем приложении, и у меня есть одна таблица для этого. Структура таблицы выглядит следующим образом:
CREATE TABLE `urls` (
`id` int(11) NOT NULL,
`url_id` varchar(10) DEFAULT NULL,
`long_url` varchar(255) DEFAULT NULL,
`clicked` mediumint(5) NOT NULL DEFAULT 0,
`user_id` varchar(7) DEFAULT NULL,
`type` varchar(15) DEFAULT NULL,
`ad_id` int(11) DEFAULT NULL,
`campaign` int(11) DEFAULT,
`increment` tinyint(1) NOT NULL DEFAULT 0,
`date` date DEFAULT NULL,
`del` enum('1','0') NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT
ALTER TABLE `urls`
ADD PRIMARY KEY (`id`),
ADD KEY `url_id` (`url_id`),
ADD KEY `type` (`type`),
ADD KEY `campaign` (`campaign`),
ADD KEY `ad_id` (`ad_id`),
ADD KEY `date` (`date`),
ADD KEY `user_id` (`user_id`);
Таблица теперь содержит 20 000 000 записей и в настоящее время растет на 300–400 000 записей в день.
url_id
столбец уникален varchar(10)
и URL выглядит так: http://example.com/asdfghjklu
Теперь я разделил эту таблицу на 10 разделов по HASH(id)
:
PARTITION BY HASH (`id`)
PARTITIONS 10;
Когда я пытаюсь сгенерировать отчеты и присоединиться к этой таблице по запросу других становится очень медленным, настолько медленным, даже не может получить отчет за 1 неделю.
Когда я пытаюсь сделать большой запрос в этой таблице, я фильтрую почти каждый запрос с датами, и я думаю, что будет гораздо лучше, если я разделю эта таблица по date
столбцу. Это хорошая идея?
Когда я читаю, если я хочу разбить эту таблицу по дате, мне нужно добавить дату в составной первичный ключ: PRIMARY KEY(id, date)
Что вы думаете об этом? Как улучшить производительность моего запроса?