Разделы MySQL: данные не сбалансированы в разделах

Я запускаю MySQL 5.1.47 с АКТИВНЫМ плагином раздела.

Я создаю следующую таблицу:

CREATE TABLE IF NOT EXISTS `prova` ( 
`NE` varchar(8) NOT NULL, 
`ASSERT` longtext NOT NULL 
) ENGINE=MyISAM 
PARTITION BY KEY(NE) 
PARTITIONS 4; 

Затем я вставляю 4 строки:

INSERT INTO prova values ('AAA','this assert is from AAA'); 
INSERT INTO prova values ('BBB','this assert is from BBB'); 
INSERT INTO prova values ('CCC','this assert is from CCC'); 
INSERT INTO prova values ('DDD','this assert is from DDD'); 

Я ожидаю найти 1 запись в каждом разделе, но:

mysql> explain partitions select * from prova where NE='AAA'; 
+----+-------------+-------+------------+--------+---------------+------+---------+------+------+-------+ 
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | Extra | 
+----+-------------+-------+------------+--------+---------------+------+---------+------+------+-------+ 
| 1 | SIMPLE | prova | p2 | system | NULL | NULL | NULL | NULL | 1 | | 
+----+-------------+-------+------------+--------+---------------+------+---------+------+------+-------+ 
1 row in set (0.00 sec) 

mysql> explain partitions select * from prova where NE='BBB'; 
+---+-------------+-------+------------+------+---------------+------+---------+------+------+-------------+ 
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | Extra | 
+----+-------------+-------+------------+------+---------------+------+---------+------+------+-------------+ 
| 1 | SIMPLE | prova | p1 | ALL | NULL | NULL | NULL | NULL | 4 | Using where | 
+----+-------------+-------+------------+------+---------------+------+---------+------+------+-------------+ 
1 row in set (0.00 sec) 

mysql> explain partitions select * from prova where NE='CCC'; 
+----+-------------+-------+------------+--------+---------------+------+---------+------+------+-------+ 
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | Extra | 
+----+-------------+-------+------------+--------+---------------+------+---------+------+------+-------+ 
| 1 | SIMPLE | prova | p0 | system | NULL | NULL | NULL | NULL | 1 | | 
+----+-------------+-------+------------+--------+---------------+------+---------+------+------+-------+ 
1 row in set (0.00 sec) 

mysql> explain partitions select * from prova where NE='DDD'; 
+----+-------------+-------+------------+------+---------------+------+---------+------+------+-------------+ 
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | Extra | 
+----+-------------+-------+------------+------+---------------+------+---------+------+------+-------------+ 
| 1 | SIMPLE | prova | p1 | ALL | NULL | NULL | NULL | NULL | 4 | Using where | 
+----+-------------+-------+------------+------+---------------+------+---------+------+------+-------------+ 
1 row in set (0.00 sec)

Итак, мой вопрос: что я делаю неправильно? Почему 4 вставки не разбиты на 4 раздела? Почему BBB и DDD оказались в одном разделе?

Большое спасибо за Вашу помощь! Эван)


person EBAH    schedule 26.11.2011    source источник
comment
Я только что обнаружил, что если я использую A, B, C, D вместо AAA, BBB, CCC, DDD, разделение работает нормально. Не могли бы вы предложить, как разделить таблицу на основе строки, а не одного символа? Спасибо!!!   -  person EBAH    schedule 26.11.2011


Ответы (1)


Согласно руководству MySQL http://dev.mysql.com/doc/refman/5.1/en/partitioning-key.html разбиение по KEY похоже на разбиение по HASH, за исключением того, что функция хэширования теперь выбирается внутри MySQL (а не пользователем, как в разделе HASH).

В мануале в этом нет ясности, но функция должна быть либо MD5(), PASSWORD(), либо функция на основе последней. Таким образом, он выбирает раздел не на основе значения NE, а на основе вычисленного из него хэша. Используемые хэш-функции имеют равномерное распределение, поэтому, когда у вас много строк, они будут равномерно распределены между разделами.

Поэтому, если вы хотите выбрать функцию для разделения, вы должны использовать разделение по HASH. Но чего вы ожидали? Или каковы возможные значения столбца NE?

person Marki555    schedule 13.01.2012