Деление таблицы на партиции.

Buldozer

Новичок
Деление таблицы на партиции.

Есть две проблемы – не очень хорошо владею английским, и не очень хорошо понимаю тему партиционирования в mysql – поэтому разобраться в маннах, не очень просто.

Задача такая – есть таблица
PHP:
mysql> describe table1;
+---------------+------------------+------+-----+---------+----------------+
| Field         | Type             | Null | Key | Default | Extra          |
+---------------+------------------+------+-----+---------+----------------+
| page_id       | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| site_id       | int(10) unsigned | NO   | MUL | NULL    |                |
| page_url      | char(255)        | NO   |     | NULL    |                |
| accepted_date | int(10)          | NO   | MUL | NULL    |                |
+---------------+------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
производительность которой нужно увеличить с помощью партиционирования
PHP:
+--------+------------+---------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+
| Table  | Non_unique | Key_name      | Seq_in_index | Column_name   | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+--------+------------+---------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+
| table1 |          0 | PRIMARY       |            1 | page_id       | A         |    40834162 |     NULL | NULL   |      | BTREE      |         |
| table1 |          1 | accepted_date |            1 | accepted_date | A         |       86881 |     NULL | NULL   |      | BTREE      |         |
| table1 |          1 | site_id       |            1 | site_id       | A         |       28878 |     NULL | NULL   |      | BTREE      |         |
| table1 |          1 | site_id       |            2 | page_url      | A         |    40834162 |     NULL | NULL   |      | BTREE      |         |
+--------+------------+---------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+
4 rows in set (0.00 sec)
В основном все выборки из идут по полю site_id, поэтому есть идея, что если разбить по HASH(site_id), то(как я представляю) мускуль равномерно раскидает данные по маленьким таблицам, причем все записи принадлежащих определенным site_id будут хранится в определенной таблице(ну т.е. все site_id = 2 будут находится исключительно в партиции№1) и тогда мускуль во время выборки будет обрабатывать не одну большую таблицу(в случае без партиционирования) и не кучу маленьких по порядку(в случае партиционирования по какому-то другому полю), а только одну маленькую таблицу(т.к. он знает, что все site_id = 2 лежат строго в партиции№1). От чего я и надеюсь получить прирост производительности.

Попытка выполнить задуманное, обернулась следующим.
PHP:
mysql> ALTER TABLE table4 PARTITION BY HASH(site_id) PARTITIONS 20;
ERROR 1503 (HY000): A PRIMARY KEY must include all columns in the table's partitioning function
В связи с описанными выше проблемами, я не очень понял смысл траблы… в итоге включил требуемое поле в PRIMARY KEY, и получил подобное:
PHP:
mysql> show index from tt4;
+-------+------------+---------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name      | Seq_in_index | Column_name   | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+-------+------------+---------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+
| tt4   |          0 | PRIMARY       |            1 | page_id       | A         |        NULL |     NULL | NULL   |      | BTREE      |         |
| tt4   |          0 | PRIMARY       |            2 | site_id       | A         |           0 |     NULL | NULL   |      | BTREE      |         |
| tt4   |          1 | accepted_date |            1 | accepted_date | A         |        NULL |     NULL | NULL   |      | BTREE      |         |
| tt4   |          1 | site_id       |            1 | site_id       | A         |        NULL |     NULL | NULL   |      | BTREE      |         |
| tt4   |          1 | site_id       |            2 | page_url      | A         |        NULL |     NULL | NULL   |      | BTREE      |         |
+-------+------------+---------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+
5 rows in set (0.00 sec)
ну и далее
PHP:
mysql> alter table tt4 PARTITION BY HASH(site_id) PARTITIONS 20;
что успешно выполнилось.

Сейчас я попытаюсь замерить производительность на операция чтения/записи для этого варианта, по сравнению с «беспартиционным».

Вопрос – верно ли я делаю это?

p.s. там есть поле accepted_date, но в моем случае использовать его для партиционирования по диапазонам смысла нет, т.к. в 98% случаев выборка это поле вообще не учитывается.
 
Сверху