基于MySQL分区性能的详细介绍(2)

加载数据的情况如下:

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 |

+——–+——————-+————-+—————–+

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/ba72b3f911f4174702e3860aa4b846a0.html