每个表独立表空间的好处之一是可以从文件大小直接看出表大小。例如:
[root@redflag11012501 tpch2]# ll
总计 13145964
-rw-rw---- 1 mysql mysql 8850 06-10 16:16 customer.frm
-rw-rw---- 1 mysql mysql 301989888 06-10 16:16 customer.ibd
-rw-rw---- 1 mysql mysql 65 06-10 15:15 db.opt
-rw-rw---- 1 mysql mysql 9226 06-10 15:20 lineitem.frm
-rw-rw---- 1 mysql mysql 9353297920 06-10 15:34 lineitem.ibd
-rw-rw---- 1 mysql mysql 8692 06-10 16:11 nation.frm
-rw-rw---- 1 mysql mysql 98304 06-10 16:11 nation.ibd
-rw-rw---- 1 mysql mysql 8928 06-10 16:23 orders.frm
-rw-rw---- 1 mysql mysql 2000683008 06-10 16:27 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-10 16:17 partsupp.frm
-rw-rw---- 1 mysql mysql 1430257664 06-10 16:20 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-10 16:17 supplier.frm
-rw-rw---- 1 mysql mysql 26214400 06-10 16:17 supplier.ibd3.测试数据和查询语句的产生步骤
主要步骤参照本系列第一篇文章《Oracle 11g R2企业版评测》。然后需要针对SQL Server的特性作修改。
Tpc-h的qgen产生的查询语句基本上满足了MySQL的语法要求,只需要将limit 前面一行的分号去掉即可。为了标识查询的编号,我们在每个查询前面插入prompt 序号。
将修改完成后的22个查询语句保存为mysql_tpch.sql文件。
MySQL的查询计时是默认打开的,因此不需要设置。
4.数据压缩测试
表压缩是INNODB的一个有用的功能,可以显著减少数据在磁盘上占用的空间。
为了启用表压缩功能,必须满足2个先决条件。
1.设置前文提到的innodb_file_per_table参数,启用单个表独立innodb数据文件;
2.设置innodb_file_format=barracuda,指定innodb文件格式为Barracuda。
然后在创建表时就可以指定ROW_FORMAT=COMPRESSED选项来创建压缩表,默认是不压缩的。下面比较一下创建非压缩表和压缩表的时间和空间占用情况。
mysql> create table part1 as select * from part;
Query OK, 2000000 rows affected (19.58 sec)
Records: 2000000 Duplicates: 0 Warnings: 0
mysql> set global innodb_file_format=barracuda;
Query OK, 0 rows affected (0.00 sec)
mysql> create table part2 ROW_FORMAT=COMPRESSED as select * from part;
Query OK, 2000000 rows affected (46.60 sec)
Records: 2000000 Duplicates: 0 Warnings: 0
[root@redflag11012501 tpch]# pwd
/var/lib/mysql/tpch
[root@redflag11012501 tpch]# ll part?.*
-rw-rw---- 1 mysql mysql 8874 06-10 09:51 part1.frm
-rw-rw---- 1 mysql mysql 348127232 06-10 09:52 part1.ibd
-rw-rw---- 1 mysql mysql 8874 06-10 10:08 part2.frm
-rw-rw---- 1 mysql mysql 176160768 06-10 10:09 part2.ibd可以看出,创建压缩表的时间大约是非压缩表的2倍,占用的磁盘空间大约是非压缩表的1/2。
下面再比较一下查询的性能。
mysql> select count(*),p_type from part group by p_type;
+----------+---------------------------+
| count(*) | p_type |
+----------+---------------------------+
| 13399 | ECONOMY ANODIZED BRASS |
| 13678 | ECONOMY ANODIZED COPPER |
| 13423 | ECONOMY ANODIZED NICKEL |
| 13452 | ECONOMY ANODIZED STEEL |
...
| 13115 | STANDARD POLISHED TIN |
+----------+---------------------------+
150 rows in set (14.06 sec)
mysql> select count(*),p_type from part1 group by p_type;
150 rows in set (3.74 sec)
mysql> select count(*),p_type from part2 group by p_type;
150 rows in set (8.60 sec)可以看出单个表一个innodb数据文件的查询性能要好于多个表存放在同一个数据文件,而不压缩(ROW_FORMAT=COMPACT)的表比压缩后的表查询又快1倍。
这里只是一个表的情况,下面,我们将对8个表添加主外键后再比较它们的大小。
另外,压缩的表进行DML操作的效率较低,因此不适用于频繁数据更改的表。