Таблица MySQL разделов и подразделов по первичным ключам и 2 индексам для повышения производительности - PullRequest
0 голосов
/ 17 августа 2011

У меня есть очень большая таблица, и я готовлю к ней очень простые запросы, такие как поиск по идентификатору.запрос стал медленнее со временем из-за увеличения строк таблицы.я выполняю около 300 запросов в секунду, и это заставляет мой скрипт работать медленно и моя память до 99% (объем памяти меньше, чем размер БД), я хочу разделить и подразделить таблицу для максимальной производительности, вот моя таблица (изиз 30 таблиц, как это), пожалуйста, добавьте код, потому что я очень плохо разбираюсь в разделах и не знаю много.запросы на выбор есть только в том случае, когда условие для поиска идентификаторов и простых вставок.Я хочу обновить оперативную память, чтобы она была больше, чем размер БД, но я хочу избежать ее, и я не знаю, решит ли она проблему лучше, чем разделение.

CREATE TABLE `books` (
    `id` INT(10) NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(200) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
    `picture` VARCHAR(500) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
    `url` VARCHAR(500) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
    `created` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    INDEX `url` (`url`(333)),
    INDEX `name` (`name`)
)
COLLATE='utf8_unicode_ci'
ENGINE=MyISAM
ROW_FORMAT=DEFAULT
AUTO_INCREMENT=937

Вот несколько примеров моегозапросы:

SELECT id FROM books WHERE url = 'blabla';
INSERT INTO user_books SET book_id = '3', user_id = '10';

каждый запрос занимает около 0,05-0,2 секунды

я получил около 5-10 миллионов строк в каждой таблице.

Размер БД равен 10 ГБ, о котором я думалобновление оперативной памяти до 16 ГБ

1 Ответ

2 голосов
/ 15 октября 2012

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

В вашем случае, кажется, что запросы используют id чаще всего, и поскольку это первичный ключ, синтаксис очень прост:

CREATE TABLE `books` (
    `id` INT(10) NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(200) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
    `picture` VARCHAR(500) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
    `url` VARCHAR(500) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
    `created` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    INDEX `url` (`url`(333)),
    INDEX `name` (`name`)
)
PARTITION BY KEY()
PARTITIONS 8;
COLLATE='utf8_unicode_ci'
ENGINE=MyISAM
ROW_FORMAT=DEFAULT
AUTO_INCREMENT=937

Выше будет создано 8 разделов. Поскольку я не указал ни один столбец для использования с предложением разделения, MySQL по умолчанию использует первичный ключ, что будет хорошо в вашем случае.

При условии разумно сбалансированного разброса целочисленных значений, используемых в столбце id, каждый раздел будет составлять примерно 1,25 ГБ. При выполнении запроса для определенного идентификатора теперь следует выбирать данные только из одного раздела, что ускоряет доступ.

Вы можете обратиться к документации MySQL здесь: http://dev.mysql.com/doc/refman/5.5/en/partitioning-key.html

Само собой разумеется, id является первичным ключом, так что это уже должно было быть достаточно быстрым. Я не уверен в большем количестве предостережений, которые могут применяться к индексам + разделам с MyISAM. Я работаю в основном с InnoDb, и это то, что я хотел бы сделать, по крайней мере с InnoDb, чтобы улучшить производительность моих запросов.

...