я пытаюсь проверить преимущество секционирования в MysqlПочему MySQL разделение не имеет никакого эффекта в моем случае
Я создал две таблицы: одна распределяли другой нет.
В каждом столе есть 10M записей в нем.
Я хочу быстро запросить "user_to_id" column.
Разделенный стол (1024 части):
CREATE TABLE `neworder10M_part_byuser` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`site_from_id` int(11) NOT NULL,
`site_to_id` int(11) NOT NULL,
`user_from_id` int(11) NOT NULL,
`user_to_id` int(11) NOT NULL,
`created` datetime NOT NULL,
PRIMARY KEY (`id`,`user_to_id`),
KEY `composite_cover` (`user_to_id`,`user_from_id`,`site_from_id`,`site_to_id`,`created`)
) ENGINE=InnoDB
/*!50100 PARTITION BY HASH (user_to_id)
PARTITIONS 1024 */ |
Таблица с кластерным ключом (не секционированный):
CREATE TABLE `neworder_10M` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`site_from_id` int(11) NOT NULL,
`site_to_id` int(11) NOT NULL,
`user_from_id` int(11) NOT NULL,
`user_to_id` int(11) NOT NULL,
`created` datetime NOT NULL,
PRIMARY KEY (`user_to_id`,`id`),
UNIQUE KEY `id_UQ` (`id`)
) ENGINE=InnoDB;
, когда я тест обе таблицы с питона сценарием для 1000 Reqs:
for i in xrange(1,REQS):
user_id = random.randint(1,10000);
cursor.execute("select * from neworder10M_part_byuser where user_to_id=%s;" % (user_id))
Таблица разделов: 22 об/мин Не секционировано: 22,7 об./Мин
Почему нет преимущества скорости с секционированной таблицей? Поскольку я ожидаю, что меньшие данные - более быстрый запрос.
И объяснить также показывает, что раздел используется:
mysql> explain select * from neworder10M_part_byuser where user_to_id=6867;
+----+-------------+-------------------------+------------+------+-----------------+-----------------+---------+-------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------------------------+------------+------+-----------------+-----------------+---------+-------+------+----------+-------------+
| 1 | SIMPLE | neworder10M_part_byuser | p723 | ref | composite_cover | composite_cover | 4 | const | 1009 | 100.00 | Using index |
+----+-------------+-------------------------+------------+------+-----------------+-----------------+---------+-------+------+----------+-------------+
, но я не видел реальную скорость улучшения в реальности .... что я делаю неправильно?
таблицы заполнить код:
def send_orders(cur,users=10000,orders=10000000):
for i in xrange(1,orders+1): //10000000 rows here
print i
from_user = random.randint(1,users)
to_user = random.randint(1,users)
from_site = random.randint(1,10000)
to_site = random.randint(1,10000)
cur.execute("INSERT INTO neworder (site_from_id, site_to_id,user_from_id, user_to_id,created) VALUES ('%d','%d','%d','%d',NOW());" % (from_user,to_user,from_site,to_site))
версия MySQL: Ver 14.14 DISTRIB 5.7.12 для Linux (x86_64). Жесткий диск - ssd.
«Мы не ожидаем большой разницы в производительности для операторов SELECT», почему? как я понимаю по ключу раздела, можно определить раздел pXXX для O (1) времени, а затем сканировать только одно определенное разбиение на разделы быстрее, потому что индекс содержит 10K строк и 10M строк индекса таблицы без разделов. Почему индекс времени сканирования на 10K строк равен индексу сканирования на 10-миллиметровых строках? – Evg
Потому что он не выполняет * полное * сканирование каждой записи индекса. Индекс организован таким образом, который позволяет механизму хранения очень быстро сужать на блоках, которые могут содержать записи, которые он ищет. С индексом есть огромные полосы блоков, которые невозможно для записей. Вот как работают индексы. Что касается размещения записей, не имеет значения, есть ли 10 000 блоков или 10 000 000 блоков, которые не нужно проверять. Вот почему производительность одинакова. – spencer7593
«Не имеет значения, есть ли 10 000 блоков или 10 000 000 блоков, которые не нуждаются в проверке. Именно поэтому производительность - это то же самое« I Mysql ». Я думаю, что это неверный оператор. Индекс использует b + деревья.). Я просто тестирую таблицу на 100 тыс. Строк и получаю 1215 рпс против 20 рпс на таблице строк 10М. Таким образом, поиск в разделе с 10 тыс. Строк будет намного быстрее, чем 100 КБ, и намного больше, чем с 10 М. – Evg