Buldozer
Новичок
Деление таблицы на партиции.
Есть две проблемы – не очень хорошо владею английским, и не очень хорошо понимаю тему партиционирования в mysql – поэтому разобраться в маннах, не очень просто.
Задача такая – есть таблица
производительность которой нужно увеличить с помощью партиционирования
В основном все выборки из идут по полю site_id, поэтому есть идея, что если разбить по HASH(site_id), то(как я представляю) мускуль равномерно раскидает данные по маленьким таблицам, причем все записи принадлежащих определенным site_id будут хранится в определенной таблице(ну т.е. все site_id = 2 будут находится исключительно в партиции№1) и тогда мускуль во время выборки будет обрабатывать не одну большую таблицу(в случае без партиционирования) и не кучу маленьких по порядку(в случае партиционирования по какому-то другому полю), а только одну маленькую таблицу(т.к. он знает, что все site_id = 2 лежат строго в партиции№1). От чего я и надеюсь получить прирост производительности.
Попытка выполнить задуманное, обернулась следующим.
В связи с описанными выше проблемами, я не очень понял смысл траблы… в итоге включил требуемое поле в PRIMARY KEY, и получил подобное:
ну и далее
что успешно выполнилось.
Сейчас я попытаюсь замерить производительность на операция чтения/записи для этого варианта, по сравнению с «беспартиционным».
Вопрос – верно ли я делаю это?
p.s. там есть поле accepted_date, но в моем случае использовать его для партиционирования по диапазонам смысла нет, т.к. в 98% случаев выборка это поле вообще не учитывается.
Есть две проблемы – не очень хорошо владею английским, и не очень хорошо понимаю тему партиционирования в 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)
Попытка выполнить задуманное, обернулась следующим.
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
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% случаев выборка это поле вообще не учитывается.