web-dev-qa-db-ja.com

サブパーティション化は実際にどのように機能し、どのような物理ファイルが作成されますか?

Mysqlでサブパーティションがどのように機能するのか理解できません。
私は次の例を読んでいます:

create table invoices (  
customer_id int not null,    
product_id int not null,    
amount decimal (8,2) not null,    
entry_date date not null default '2006-01-01',   
store_id int not null   
)  
partition by range (year(entry_date))  
subpartition by hash(customer_id)  
subpartitions 4 (  
partition p0 values less than (2008),   
partition p1 values less than (2009),   
partition p2 values less than (2010),  
partition p3 values less than (2011),  
partition plast values less than MAXVALUE  
);  

これがHDでどのように形成されるのか理解または視覚化できません。
4 * 5 = 20の物理ファイルが作成されると思います。これは正しいです?
そして、どのデータが一緒に保存されますか?同じハッシュを持つすべての顧客の2008年の日付の「クラスタリング」はありますか?私はそれについて混乱しています。また、データの取得方法もわかりません。
最初にcustomer_idハッシュを使用して、範囲パーティションを決定しますか、またはその逆です。データをフェッチするための正確な手順は何ですか?

[〜#〜] update [〜#〜]
もう一つの例。私は次のことをしました:

mysql> create table nums_composite (  
    -> id int, happened datetime not null,  
    -> primary key (id, happened)  
    -> ) engine=InnoDB   
    -> partition by range (hour(happened))  
    -> subpartition by hash(id) subpartitions 2  
    -> (  
    -> partition p0 values less than (10),  
    -> partition p1 values less than (20),  
    -> partition p2 values less than MAXVALUE  
    -> );  
Query OK, 0 rows affected (0.28 sec)  


mysql> select partition_name, subpartition_name as sub, partition_method as method,   partition_description ,table_rows from information_schema.partitions where table_name='nums_composite';  
+----------------+-------+--------+-----------------------+------------+  
| partition_name | sub   | method | partition_description | table_rows |  
+----------------+-------+--------+-----------------------+------------+  
| p0             | p0sp0 | RANGE  | 10                    |         17 |  
| p0             | p0sp1 | RANGE  | 10                    |         24 |  
| p1             | p1sp0 | RANGE  | 20                    |         20 |  
| p1             | p1sp1 | RANGE  | 20                    |         17 |  
| p2             | p2sp0 | RANGE  | MAXVALUE              |         13 |  
| p2             | p2sp1 | RANGE  | MAXVALUE              |          9 |  
+----------------+-------+--------+-----------------------+------------+  
6 rows in set (0.00 sec)  

Hash_no *サブパーティションファイルを作成するのは正しいようですが、どこにありますか?

root@jim-Linux:/# find . -iname "*_composite*"  
./var/lib/mysql/partioning_chapter_test/nums_composite.frm  
./var/lib/mysql/partioning_chapter_test/nums_composite.par   

実際のファイルが表示されないのはなぜですか?

2
Jim

Windowsでのサンプル

MySQL5.6.15のラップトップで次を実行しました

mysql> use test
Database changed
mysql> drop table if exists nums_composite;
Query OK, 0 rows affected (0.70 sec)

mysql> create table nums_composite (
    -> id int, happened datetime not null,
    -> primary key (id, happened)
    -> ) engine=InnoDB
    -> partition by range (hour(happened))
    -> subpartition by hash(id) subpartitions 2
    -> (partition p0 values less than (10),
    -> partition p1 values less than (20),
    -> partition p2 values less than MAXVALUE);
Query OK, 0 rows affected (1.91 sec)

mysql> show create table nums_composite\G
*************************** 1. row ***************************
       Table: nums_composite
Create Table: CREATE TABLE `nums_composite` (
  `id` int(11) NOT NULL DEFAULT '0',
  `happened` datetime NOT NULL,
  PRIMARY KEY (`id`,`happened`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
/*!50100 PARTITION BY RANGE (hour(happened))
SUBPARTITION BY HASH (id)
SUBPARTITIONS 2
(PARTITION p0 VALUES LESS THAN (10) ENGINE = InnoDB,
 PARTITION p1 VALUES LESS THAN (20) ENGINE = InnoDB,
 PARTITION p2 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */
1 row in set (0.01 sec)

mysql>

私はOSに行き、以下を実行しました:

C:\>cd \MySQL_5.6.15\data\test

C:\MySQL_5.6.15\data\test>dir nums_comp*
 Volume in drive C is TI10665200H
 Volume Serial Number is A273-2EFF

 Directory of C:\MySQL_5.6.15\data\test

08/31/2014  04:09 PM            98,304 nums_composite#p#p0#sp#p0sp0.ibd
08/31/2014  04:09 PM            98,304 nums_composite#p#p0#sp#p0sp1.ibd
08/31/2014  04:09 PM            98,304 nums_composite#p#p1#sp#p1sp0.ibd
08/31/2014  04:09 PM            98,304 nums_composite#p#p1#sp#p1sp1.ibd
08/31/2014  04:09 PM            98,304 nums_composite#p#p2#sp#p2sp0.ibd
08/31/2014  04:09 PM            98,304 nums_composite#p#p2#sp#p2sp1.ibd
08/31/2014  04:09 PM             8,594 nums_composite.frm
08/31/2014  04:09 PM                96 nums_composite.par
               8 File(s)        598,514 bytes
               0 Dir(s)  686,691,409,920 bytes free

C:\MySQL_5.6.15\data\test>

ファイルが表示されない理由は?

MySQL 5.6ではデフォルトで innodb_file_per_table が有効になっているため、データファイルを表示できます。

mysql> show global variables like 'innodb_file_per_table';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | ON    |
+-----------------------+-------+
1 row in set (0.00 sec)

mysql>

あなたの場合、innodb_file_per_tableを無効にする必要があります。実際のテーブルは、システムテーブルスペースファイルibdata1(通常は/var/lib/mysqlにあります)内にありました。

私の推測

  • MySQL5.6より前のバージョンを使用しています
  • innodb_file_per_tableは、次のいずれかの理由で0に設定されています:
    • デフォルトで実行しています(my.cnfなし)
    • my.cnfinnodb_file_per_table=0があります

これを修正する方法:

ステップ1:innodb_file_per_tableを有効にする

これをmy.cnfに追加します

innodb_file_per_table=1

ステップ2:mysqlを再起動します

service mysql restart

ステップ3:テーブルを再生成します

CREATE TABLE nums_composite_new LIKE nums_composite;
INSERT INTO nums_composite_new SELECT * FROM  nums_composite;
ALTER TABLE nums_composite RENAME nums_composite_old;
ALTER TABLE nums_composite_new RENAME nums_composite;
DROP TABLE nums_composite_old;

.ibdファイルが表示されるはずです

試してみる !!!

更新2014-08-3116:37 EDT

あなたは私に尋ねました

私はubuntuにいますが、何か変わりますか?

変更されるのは、my.cnfの場所だけです。これを実行します

ls -l /etc/mysql/my.cnf

ファイルが存在する場合は、エディターで開き、innodb_file_per_table=1ヘッダーの下に[mysql]を追加します。

ファイルが存在しない場合は、これを実行します

echo "[mysqld]" > /etc/mysql/my.cnf
echo "innodb_file_per_table=1" >> /etc/mysql/my.cnf

次に、STEP 2およびSTEP 3を実行できます。

2
RolandoMySQLDBA