Об этом можно спросить раньше, но в любом случае вот такая ситуация.
У меня есть одна большая таблица (на MySQL с использованием InnoDB), которая в основном представляет собой огромный журнал, никаких реляционных вещей.
3 поля: Customer_ID, TimeStamp, Log_Data (который представляет собой крошечный текст, такой как "Visited Front Webpage" или "Logged In").
Поскольку я регистрирую активность клиентов на веб-странице, которая принимает около 10 000 пользователей в день, эта таблица довольно быстро растет.
В определенный момент я хотел узнать, сколько клиентов на самом деле что-то делали на сайте.
Итак, я запускаю следующий запрос «SELECT DISTINCT Customer_ID FROM table;», и я начал замечать, что по мере увеличения таблицы запрос занимает больше времени, что совершенно нормально и вполне ожидаемо. В один момент времени запрос начал занимать более 5 минут.
Я хотел найти более быстрый путь, поэтому я попробовал это. Допустим, я работаю с таблицей с 1 миллионом строк. Я начал с того, что разделил эту таблицу на 10 таблиц, по 100 тысяч записей каждая. Затем я запускаю «SELECT DISTINCT Customer_ID FROM table;» на каждом столе, и со всеми результатами я просто 'сортировать | uniq | wc 'их в командной строке и получить тот же результат.
Удивительно, но этот метод занял меньше половины времени, чем другой.
Я в значительной степени отвечал на вопрос сам, 10 * 100K таблиц быстрее чем 1 * 1M таблицы, НО, может быть, я делаю что-то не так, может быть, это больше проблема настройки производительности или чего-то еще, потому что таблицы должны быть разработаны хорошо выполнять независимо от их размера.
Дайте мне знать, что вы думаете.
Спасибо за чтение.
ОБНОВЛЕНИЕ: Вот как я создаю свою таблицу:
CREATE TABLE `mydb`.`mytable` (
`Customer_ID` BIGINT( 20 ) UNSIGNED NOT NULL,
`unix_time` INT( 10 ) UNSIGNED NOT NULL,
`data` TINYTEXT NOT NULL,
KEY `fb_uid` ( `fb_uid` )
) ENGINE = INNODB DEFAULT CHARSET = utf8;