先给上自己的民间说法,官方英文说法还在翻译解读中,稍后跟上
Mysql 数据库中,最常用的两种引擎是innordb和myisam。Innordb的功能要比myiasm强大很多,但是innordb的性能要比myisam差很多,如果你的网站只是做简单的查询,更新,删除,那么用myiasm是最好的选择。
测试方法:连续提交10个query, 表记录总数:38万 , 时间单位 s
引擎类型 Myisam innordb 性能相差
count 0.0008357 3.0163 3609
查询主键 0.005708 0.1574 27.57
查询非主键 24.01 80.37 3.348
更新主键 0.008124 0.8183 100.7
更新非主键 0.004141 0.02625 6.338
插入 0.004188 0.3694 88.21
结论:
1. 加了索引以后,对于Myisam查询可以加快:4 206.09733倍,对innordb 查询加快510.72921倍。同时对myisam更新速度减慢为原来的1/2,innordb的更新速度减慢为原来的1/30。大家要看情况决定是否要加索引,比如不查询的log表,不要做任何的索引。
2. 如果你的数据量是百万级别的,并且没有任何的事务处理,那么用myisam是性能最好的选择。
3. Innordb的表的大小更加的大,用myisam可以省很多的硬盘空间。
在我们测试的这个38w的表中,表占用空间的情况如下:
引擎类型 MyIsam InnorDB
数据 53,924 KB 58,976 KB
索引 13,640 KB 21,072 KB
占用总空间 67,564 KB 80,048 KB
另外一个176W万记录的表, 表占用空间的情况如下:
引擎类型 MyIsam InnorDB
数据 56,166 KB 90,736 KB
索引 67,103 KB 88,848 KB
占用总空间 123,269 KB 179,584 KB
一般来说,
MYisam 适合:
1. 做很多count 的计算。
2. 插入不平凡,查询非常频繁。
3. 没有事务
innordb 非常适合:
1. 可靠性要求比较高,或者要求事务。
2. 表更新和查询都相当的频繁,并且表锁定的机会比较大的情况。
当然这也不是绝对的。要试验过才知道。
很多时候,性能瓶颈不是因为服务器配置不好,而是因为SQL不是很好。SQL的性能优化是关键。
除了这些常见的优化方法,
还可以考虑 使用内存表。你测试一张myisam 和 内存表,会发现速度差不多。
其实,在并发比较强的时候,性能会相差大概五倍。我有张经常要查询的IP 地址 和 地区的 对应表,放入内存后。
以前查询 5000个 IP 地址大概 要 15S, 现在,只要 2S多。
很多东西,实际测试过才知道。用什么压力测试,测试出来的也不是很准确。