I was studying for these two items:
- Create and utilize table partitioning
- Obtain MySQL metadata from INFORMATION_SCHEMA tables
The first step is to create a table, partition it with a hash.
mysql> CREATE TABLE pfoo (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255)) -> PARTITION BY HASH(id) PARTITIONS 4; Query OK, 0 rows affected (0.04 sec) mysql> INSERT INTO pfoo(name) VALUES('test01'),('test02'),('test03'),('test04'), -> ('test05'),('test06'),('test07'),('test08'),('test09'),('test10'),('test11'); Query OK, 11 rows affected (0.00 sec) Records: 11 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM pfoo; +----+--------+ | id | name | +----+--------+ | 4 | test04 | | 8 | test08 | | 1 | test01 | | 5 | test05 | | 9 | test09 | | 2 | test02 | | 6 | test06 | | 10 | test10 | | 3 | test03 | | 7 | test07 | | 11 | test11 | +----+--------+ 11 rows in set (0.00 sec) mysql> SELECT PARTITION_NAME, TABLE_ROWS FROM information_schema.partitions -> WHERE TABLE_NAME='pfoo'; +----------------+------------+ | PARTITION_NAME | TABLE_ROWS | +----------------+------------+ | p0 | 2 | | p1 | 3 | | p2 | 3 | | p3 | 3 | +----------------+------------+ 4 rows in set (0.01 sec)The sequence in the id column looks random, but it isn't. It's in partition order.
mysql> SELECT id,name,MOD(id,4) FROM pfoo; +----+--------+-----------+ | id | name | MOD(id,4) | +----+--------+-----------+ | 4 | test04 | 0 | | 8 | test08 | 0 | | 1 | test01 | 1 | | 5 | test05 | 1 | | 9 | test09 | 1 | | 2 | test02 | 2 | | 6 | test06 | 2 | | 10 | test10 | 2 | | 3 | test03 | 3 | | 7 | test07 | 3 | | 11 | test11 | 3 | +----+--------+-----------+ 11 rows in set (0.00 sec)So nothing new or unexpected here.
So now we're going to change the number of partitions.
mysql> ALTER TABLE pfoo PARTITION BY HASH(id) PARTITIONS 6; Query OK, 11 rows affected (0.32 sec) Records: 11 Duplicates: 0 Warnings: 0 mysql> SELECT PARTITION_NAME, TABLE_ROWS FROM information_schema.partitions -> WHERE TABLE_NAME='pfoo'; +----------------+------------+ | PARTITION_NAME | TABLE_ROWS | +----------------+------------+ | p0 | 0 | | p1 | 0 | | p2 | 2 | | p3 | 0 | | p4 | 0 | | p5 | 0 | +----------------+------------+ 6 rows in set (0.01 sec) mysql> SELECT COUNT(*) FROM pfoo; +----------+ | COUNT(*) | +----------+ | 11 | +----------+ 1 row in set (0.00 sec)So we've changed the number of partitions from 4 to 6. There are still 11 rows, but the information in information_schema.partitions seems to be wrong.
This is because innodb_stats_persistent is enabled.
mysql> SELECT * FROM mysql.innodb_table_stats WHERE table_name LIKE 'pfoo#%'; +---------------+------------+---------------------+--------+----------------------+--------------------------+ | database_name | table_name | last_update | n_rows | clustered_index_size | sum_of_other_index_sizes | +---------------+------------+---------------------+--------+----------------------+--------------------------+ | cert56 | pfoo#P#p0 | 2013-10-26 12:12:28 | 0 | 1 | 0 | | cert56 | pfoo#P#p1 | 2013-10-26 12:12:28 | 0 | 1 | 0 | | cert56 | pfoo#P#p2 | 2013-10-26 12:12:28 | 2 | 1 | 0 | | cert56 | pfoo#P#p3 | 2013-10-26 12:12:28 | 0 | 1 | 0 | | cert56 | pfoo#P#p4 | 2013-10-26 12:12:28 | 0 | 1 | 0 | | cert56 | pfoo#P#p5 | 2013-10-26 12:12:28 | 0 | 1 | 0 | +---------------+------------+---------------------+--------+----------------------+--------------------------+ 6 rows in set (0.00 sec) mysql> SELECT * FROM information_schema.global_variables -> WHERE variable_name='innodb_stats_persistent'; +-------------------------+----------------+ | VARIABLE_NAME | VARIABLE_VALUE | +-------------------------+----------------+ | INNODB_STATS_PERSISTENT | ON | +-------------------------+----------------+ 1 row in set (0.01 sec)The statistics can be updated by running 'ANALYZE TABLE pfoo'. Or by just waiting a few seconds as InnoDB will update the statistics automatically if innodb_stats_auto_recalc is enabled, but this is not instantaneous.
No comments:
Post a Comment