创建外键后的表占用空间。
mysql> system ls -l /user1/mysql_db/tpch2
总计 15625452
-rw-rw---- 1 mysql mysql 8850 06-13 11:03 customer.frm
-rw-rw---- 1 mysql mysql 327155712 06-13 11:04 customer.ibd
-rw-rw---- 1 mysql mysql 65 06-10 15:15 db.opt
-rw-rw---- 1 mysql mysql 9226 06-13 11:20 lineitem.frm
-rw-rw---- 1 mysql mysql 11341398016 06-13 11:51 lineitem.ibd
-rw-rw---- 1 mysql mysql 8692 06-13 11:03 nation.frm
-rw-rw---- 1 mysql mysql 114688 06-13 11:03 nation.ibd
-rw-rw---- 1 mysql mysql 8928 06-11 13:04 orders.frm
-rw-rw---- 1 mysql mysql 2315255808 06-11 13:09 orders.ibd
-rw-rw---- 1 mysql mysql 8874 06-10 16:11 part.frm
-rw-rw---- 1 mysql mysql 335544320 06-10 16:12 part.ibd
-rw-rw---- 1 mysql mysql 8748 06-13 11:06 partsupp.frm
-rw-rw---- 1 mysql mysql 1635778560 06-13 11:08 partsupp.ibd
-rw-rw---- 1 mysql mysql 8648 06-10 16:11 region.frm
-rw-rw---- 1 mysql mysql 98304 06-10 16:11 region.ibd
-rw-rw---- 1 mysql mysql 8804 06-13 11:03 supplier.frm
-rw-rw---- 1 mysql mysql 29360128 06-13 11:04 supplier.ibd 查看order表的索引,可见外键列上自动创建了索引。
mysql> show index from orders;
+--------+------------+------------+--------------+-------------+-----------+-------------+------------+-
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Index_type |
+--------+------------+------------+--------------+-------------+-----------+-------------+------------+-
| orders | 0 | PRIMARY | 1 | o_orderkey | A | 14928217 | BTREE |
| orders | 1 | orders_fk1 | 1 | o_custkey | A | 2132602 | BTREE |
+--------+------------+------------+--------------+-------------+-----------+-------------+------------+-
2 rows in set (0.01 sec) 执行下述命令将表转为压缩格式。可见压缩耗费的时间比较长,比外部文件导入的时间还长得多。每个表的压缩率基本上都是50%,节约空间还是比较明显的。
mysql> set global innodb_file_format=barracuda;
Query OK, 0 rows affected (0.00 sec)

mysql> alter table nation row_format=compressed;
Query OK, 25 rows affected (0.57 sec)

mysql> alter table region row_format=compressed;
Query OK, 5 rows affected (0.49 sec)

mysql> alter table customer row_format=compressed;
Query OK, 1500000 rows affected (1 min 4.93 sec)

mysql> alter table part row_format=compressed;
Query OK, 2000000 rows affected (45.82 sec)

mysql> alter table supplier row_format=compressed;
Query OK, 100000 rows affected (5.31 sec)

mysql> alter table partsupp row_format=compressed;
Query OK, 8000000 rows affected (5 min 48.06 sec)

mysql> alter table orders row_format=compressed;
Query OK, 15000000 rows affected (23 min 52.25 sec)

mysql> alter table lineitem row_format=compressed;
Query OK, 59986052 rows affected (1 hour 29 min 45.27 sec)
...

mysql> system ls -l /user1/mysql_db/tpch2
总计 7841520
-rw-rw---- 1 mysql mysql 8850 06-13 21:18 customer.frm
-rw-rw---- 1 mysql mysql 163577856 06-13 21:19 customer.ibd
-rw-rw---- 1 mysql mysql 65 06-10 15:15 db.opt
-rw-rw---- 1 mysql mysql 9226 06-13 21:50 lineitem.frm
-rw-rw---- 1 mysql mysql 5691670528 06-13 23:21 lineitem.ibd
-rw-rw---- 1 mysql mysql 8692 06-13 21:18 nation.frm
-rw-rw---- 1 mysql mysql 65536 06-13 21:18 nation.ibd
-rw-rw---- 1 mysql mysql 8928 06-13 21:28 orders.frm
-rw-rw---- 1 mysql mysql 1161822208 06-13 21:53 orders.ibd
-rw-rw---- 1 mysql mysql 8874 06-13 21:19 part.frm
-rw-rw---- 1 mysql mysql 167772160 06-13 21:20 part.ibd
-rw-rw---- 1 mysql mysql 8748 06-13 21:21 partsupp.frm
-rw-rw---- 1 mysql mysql 822083584 06-13 21:27 partsupp.ibd
-rw-rw---- 1 mysql mysql 8648 06-13 21:18 region.frm
-rw-rw---- 1 mysql mysql 65536 06-13 21:18 region.ibd
-rw-rw---- 1 mysql mysql 8804 06-13 21:21 supplier.frm
-rw-rw---- 1 mysql mysql 14680064 06-13 21:21 supplier.ibd 为了比较不同条件下的查询结果,我们进行了4种组合的查询。分别是:共享表空间不压缩,独立表空间不压缩(不创建外键),独立表空间不压缩(创建外键),独立表空间压缩,为了避免查询缓存的影响,用set session query_cache_type = OFF关闭查询缓存。每种测试都在更新统计信息(analyze table)和清空内存(flush tables)后执行2遍,取第2遍的结果。对于个别查询时间过长的查询,如第17、18和20个查询,用人工改写后的写法代替原始的,以获得一个测试时间。
利用前面第一步产生的查询脚本,执行测试的命令行如下,查询结果输出到不同的log文件,以便于比较:注意在更改表存储和索引类型后,MySQL自动更新了统计信息。
mysql> ANALYZE TABLE nation;
+--------------+---------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+--------------+---------+----------+----------+
| tpch2.nation | analyze | status | OK |
+--------------+---------+----------+----------+
1 row in set (0.01 sec)
…
mysql> show variables like 'query_cache_type';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| query_cache_type | ON |
+------------------+-------+
1 row in set (0.00 sec)

mysql> set query_cache_type = OFF;
Query OK, 0 rows affected (0.00 sec)


mysql> source /root/qall_myf.sql