加载数据的情况如下:
ID 引擘 是否分区 数据 大小 备注 加载时间 (*)1 MyISAM none 1.13亿 13 GB with PK 37 min
2 MyISAM by month 1.13亿 8 GB without PK 19 min
3 MyISAM by year 1.13亿 8 GB without PK 18 min
4 InnoDB none 1.13亿 16 GB with PK 63 min
5 InnoDB by month 1.13亿 10 GB without PK 59 min
6 InnoDB by year 1.13亿 10 GB without PK 57 min
7 Archive none 1.13亿 1.8 GB no keys 20 min
8 Archive by month 1.13亿 1.8 GB no keys 21 min
9 Archive by year 1.13亿 1.8 GB no keys 20 min
*在dual-Xeon服务器上
为了对比分区在大的和小的数据集上的效果,创建了另外9个实例,每一个包含略小于2GB的数据。
查询语句有两种
聚集查询SELECT COUNT(*)
FROM table_name
WHERE date_column BETWEEN start_date and end_date
指定记录查询SELECT column_list
FROM table_name
WHERE column1 = x and column2 = y and column3 = z
对于第一种查询,创建不同的日期范围的语句。对于每一个范围,创建一组额外的相同范围日期的查询。每个日期范围的第一个查询是冷查询,意味着是第一次命中,随后的在同样范围内的查询是暖查询,意味着至少部分被缓存。查询语句在the Forge上。
结果:
1带主键的分区表
第一个测试使用复合主键,就像原始数据表使用的一样。主键索引文件达到5.5 GB. 可以看出,分区不仅没有提高性能,主键还减缓了操作。因为如果使用主键索引查询,而索引又不能读入内存,则表现很差。提示我们分区很有用,但是必须使用得当。
+——–+—————–+—————–+—————–+
| 状态 | myisam 不分区 | myisam 月分区 | myisam 年分区 |
+——–+—————–+—————–+—————–+
| cold | 2.6574570285714 | 2.9169642 | 3.0373419714286 |
| warm | 2.5720722571429 | 3.1249698285714 | 3.1294000571429 |
+——–+—————–+—————–+—————–+
ARCHIVE引擘
+——–+—————-+—————–+—————–+
| 状态 | archive不分区 | archive月分区| archive年分区 |
+——–+—————-+—————–+—————–+
| cold | 249.849563 | 1.2436211111111 | 12.632532527778 |
| warm | 235.814442 | 1.0889786388889 | 12.600520777778 |
+——–+—————-+—————–+—————–+
注意ARCHIVE引擘月分区的响应时间比使用MyISAM好。
2不带主键的分区表
因为如果主键的大小超出了可用的key buffer,甚至全部内存,所有使用主键的查询都会使用磁盘。新的方式只使用分区,不要主键。性能有显著的提高。
按月分区表得到了70%-90%的性能提高。
+——–+——————+——————+——————+
| 状态 | myisam 不分区 | myisam 月分区 | myisam 年分区 |
+——–+——————+——————+——————+
| cold | 2.6864490285714 | 0.64206445714286 | 2.6343286285714 |
| warm | 2.8157905714286 | 0.18774977142857 | 2.2084743714286 |
+——–+——————+——————+——————+
为了使区别更明显, 我使用了两个大规模查询,可以利用分区的分区消除功能。
# query 1 – 按年统计
SELECT year(FlightDate) as y, count(*)
FROM flightstats
WHERE FlightDate BETWEEN “2001-01-01″ and “2003-12-31″
GROUP BY y
# query 2 – 按月统计
SELECT date_format(FlightDate,”%Y-%m”) as m, count(*)
FROM flightstats
WHERE FlightDate BETWEEN “2001-01-01″ and “2003-12-31″
GROUP BY m
结果显示按月分区表有30%-60%,按年分区表有15%-30%性能提升。
+———-+———–+———–+———–+
| query_id | 不分 | 月分 | 年分 |
+———-+———–+———–+———–+
| 1 | 97.779958 | 36.296519 | 82.327554 |
| 2 | 69.61055 | 47.644986 | 47.60223 |
+———-+———–+———–+———–+
处理器因素
当以上测试在家用机(Intel Dual Core 2.3 MHz CPU)上测试的时候。对于原来的对于dual Xeon 2.66 MHz来说,发现新服务器更快!。
重复上面的测试,令人吃惊:
+——–+——————-+————-+—————–+
|状态 | myisam 不分区 |myisam 月分区| myisam 年分区 |
+——–+——————-+————-+—————–+
| cold | 0.051063428571429 | 0.6577062 | 1.6663527428571 |
| warm | 0.063645485714286 | 0.1093724 | 1.2369152285714 |
+——–+——————-+————-+—————–+