MySQL的查询Cache测试
图4 是否使用cache对查询效率的影响
我曾经对MySQL的Cache作了非常大的期望。因为提高数据库的性能的最好方法就是使用大规模的Cache,但是通过查询相关资料我了解到MySQL的查询Cache有很多的限制。
3.1Without Cache测试
可以看到,MySQL从4.0后查询速度有所下降,所以我们也测试了一下不使用Cache的数据。我测试了4.0gcc编译版本和4.1gcc编译版本在在使用Cache和不使用Cache的情况下的速度。
关闭查询Cache的方法为调整参数 query_cache_size为0 或者设置 query_cache_type为0 [注]。
表6 是否使用cache的环境下的测试对比
数据库
|
4.0gcc with cache
耗时(s)
|
4.0gcc without cache
耗时(s)
|
4.1gcc with cache
耗时(s)
|
4.1gcc without cache
耗时(s)
|
插入1000000条记录
|
169
|
169
|
176
|
178
|
查询1000000条记录
|
282
|
200
|
306
|
219
|
改写1000000条记录
|
165
|
164
|
174
|
172
|
删除1000000条记录
|
172
|
171
|
179
|
181
|
插入5000000条记录
|
876
|
866
|
898
|
905
|
查询5000000条记录
|
1472
|
995
|
1595
|
1096
|
改写5000000条记录
|
816
|
832
|
859
|
875
|
删除5000000条记录
|
958
|
875
|
976
|
942
|
插入10000000条记录
|
1758
|
1743
|
1817
|
1878
|
查询10000000条记录
|
3001
|
2034
|
3257
|
2215
|
改写10000000条记录
|
1844
|
1744
|
1904
|
1862
|
删除10000000条记录
|
1908
|
1892
|
1982
|
2031
|
表7 是否使用cache的环境下的测试对比
数据库
|
4.0gcc with cache
处理速度(条/s)
|
4.0gcc without cache
处理速度(条/s)
|
4.1gcc with cache
处理速度(条/s)
|
4.1gcc without cache
处理速度(条/s)
|
插入1000000条记录
|
5917.16
|
5917.16
|
5681.82
|
5617.98
|
查询1000000条记录
|
3546.10
|
5000.00
|
3267.97
|
4566.21
|
改写1000000条记录
|
6060.61
|
6097.56
|
5747.13
|
5813.95
|
删除1000000条记录
|
5813.95
|
5847.95
|
5586.59
|
5524.86
|
插入5000000条记录
|
5707.76
|
5773.67
|
5567.93
|
5524.86
|
查询5000000条记录
|
3396.74
|
5025.13
|
3134.80
|
4562.04
|
改写5000000条记录
|
6127.45
|
6009.62
|
5820.72
|
5714.29
|
删除5000000条记录
|
5219.21
|
5714.29
|
5122.95
|
5307.86
|
插入10000000条记录
|
5688.28
|
5737.23
|
5503.58
|
5324.81
|
查询10000000条记录
|
3332.22
|
4916.42
|
3070.31
|
4514.67
|
改写10000000条记录
|
5422.99
|
5733.94
|
5252.10
|
5370.57
|
删除10000000条记录
|
5241.09
|
5285.41
|
5045.41
|
4923.68
|
图3 是否使用Cache的性能比较
这个测试可以证明,使用Cache时,同样是有成本的,特别是对查询语句,成本还比较高,单条查询SQL的使用Cache成本大约是比不是使用Cache的成本高40%,这个成本应该来自MySQL要消耗将结果保存到Cache和淘汰出Cache的时间。[注]
这儿说的是成本,不是性能比较。不过还是怀疑MySQL的Cache设计有问题。
MySQL有一个配置参数query_cache_type 表示查询的Cache类型。0表示 OFF,不进行缓冲,1 表示ON,进行缓冲,2表示 DEMAND,只对SELECT SQL_CACHE开头的查询进行缓冲。
3.2查询时使用Cache
如何让查询时能使用上Cache,我考虑这样进行测试,查询1条记录后,再查询4次。同时不进行任何操作,保证后面的查询命中Cache。测试的数量为1000000条。
测试的结果如下:
表8 查询1000000条记录5次的消耗时间
数据库
|
查询1000000条记录5次耗时
|
平均
|
MySQL3.23
|
1082
|
4621.07
|
MySQL 4.0 gcc
|
892
|
5605.38
|
MySQL 4.1 gcc
|
855
|
5847.95
|
MySQL 4.1 gcc(不使用查询Cache)
|
1410
|
3546.10
|
MySQL 4.1 icc
|
858
|
5827.51
|
MySQL 4.1 icc(不使用查询Cache)
|
1530
|
3267.97
|
MySQL 5.0
|
942
|
5307.86
|

可以看到MySQL的Cache在这个理想的测试环境下确实提高了。但是这些提高也是要付出代价的。
3.3查询Cache的代价
正当我对上面的结果欢心鼓舞是,而查询的资料发现给自己浇了些冷水,上面的测试非常理想,MySQL的Cache使用有很多限制。
首先我们从Without Cache组测试数据可以看到,使用Cache后进行查询是有成本的。
在Cache中的MySQL查询结果是和查询SQL对应的,如果你想命中Cache,两次使用的查询语句必须完全一样。所以你最好使用同1个人编写的API查询数据库。
另外,MySQL的查询Cache淘汰策略近乎弱智,对于MyISAM引擎,对数据表的任何一次都会淘汰所有相关此表在Cache中的数据[注],而InnoDB的引擎会在任何一次提交后淘汰所有的和此次交易相关表在Cache中的数据。所以对于一个频繁进行操作的数据库,MySQL的查询Cache的命中率肯定不会太高,而且查询同时要增加和Cache相关的成本,要消耗有入Cache和淘汰出Cache的时间。
所以你在使用MySQL Cache时最好仔细考虑一下。如果数据库的数据表基本是静态数据。可以使用这个Cache。如果是动态数据,而且改写操作频繁,是否值得用这个Cache很值得怀疑。
此文章由 http://www.ositren.com 收集整理 ,地址为: http://www.ositren.com/htmls/67672.html