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
実際のファイルが表示されないのはなぜですか?
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
にあります)内にありました。
my.cnf
なし)my.cnf
とinnodb_file_per_table=0
がありますこれを修正する方法:
innodb_file_per_table
を有効にするこれをmy.cnf
に追加します
innodb_file_per_table=1
service mysql restart
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
ファイルが表示されるはずです
あなたは私に尋ねました
私は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
を実行できます。