技术开发 频道

主流行式数据库评测之开源MySQL5.5版本

   每个表独立表空间的好处之一是可以从文件大小直接看出表大小。例如:

[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.ibd

   3.测试数据和查询语句的产生步骤

  主要步骤参照本系列第一篇文章《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操作的效率较低,因此不适用于频繁数据更改的表。

0
相关文章