mysql 优化系列(一)
Mysql 数据库中,最常用的两种引擎是 innordb 和 myisam。Innordb 的功能要比 myiasm 强大很多,但是 innordb 的性能要比 myisam 差很多,如果你的网站只是做简单的查询,更新,删除,那么用 myiasm 是最好的选择。
所有的性能测试在:Micrisoft window xp sp2 , Intel(R) Pentinum(R) M processor 1.6oGHz 1G 内存的电脑上测试。
测试结果:
测试方法:连续提交 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 引擎和 InnorDB 引擎简介:
MyISAM
MyISAM 是 MySQL 的 ISAM 扩展格式和缺省的数据库引擎。除了提供 ISAM 里所没有的索引和字段管理的大量功能,MyISAM 还使用一种表格锁定的机制,来优化多个并发的读写操作。其代价是你需要经常运行 OPTIMIZE TABLE 命令,来恢复被更新机制所浪费的空间 (学过数据结构的都应该知道,ISAM 文件格式的缺陷)。MyISAM 还有一些有用的扩展,例如用来修复数据库文件的 MyISAMChk 工具和用来恢复浪费空间的 MyISAMPack 工具。
MyISAM 强调了快速读取操作,这可能就是为什么 MySQL 受到了 web 开发如此青睐的主要原因:在 Web 开发中你所进行的大量数据操作都是读取操作。所以,大多数虚拟主机提供商和 Internet 平台提供商(Internet Presence Provider,IPP)只允许使用 MyISAM 格式。 MYISAM 格式的一个重要缺陷就是不能在表损坏后恢复数据。
InnorDB
InnoDB 数据库引擎都是造就 MySQL 灵活性的技术的直接产品,这项技术就是 MySQL++ API。在使用 MySQL 的时候,你所面对的每一个挑战几乎都源于 ISAM 和 MyISAM 数据库引擎不支持事务处理也不支持外来键。尽管要比 ISAM 和 MyISAM 引擎慢很多,但是 InnoDB 包括了对事务处理和外键的支持,这两点都是前两个引擎所没有的。如前所述,如果你的设计需要这些特性中的一者或者两者,那你就要被迫使用后两个引擎中的一个了。
Mysql 官方对 InnorDB 是这样解释的:
InnoDB 给 MySQL 提供了具有提交,回滚和崩溃恢复能力的事务安全(ACID 兼容)存储引擎。InnoDB 锁定在行级并且也在 SELECT 语句提供一个 Oracle 风格一致的非锁定读。这些特色增加了多用户部署和性能。没有在 InnoDB 中扩大锁定的需要,因为在 InnoDB 中行级锁定适合非常小的空间。InnoDB 也支持 FOREIGN KEY 强制。在 SQL 查询中,你可以自由地将 InnoDB 类型的表与其它 MySQL 的表的类型混合起来,甚至在同一个查询中也可以混合。
InnoDB 是为处理巨大数据量时的最大性能设计。它的 CPU 效率可能是任何其它基于磁盘的关系数据库引擎所不能匹敌的。
InnoDB 存储引擎被完全与 MySQL 服务器整合,InnoDB 存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。InnoDB 存储它的表&索引在一个表空间中,表空间可以包含数个文件(或原始磁盘分区)。这与 MyISAM 表不同,比如在 MyISAM 表中每个表被存在分离的文件中。InnoDB 表可以是任何尺寸,即使在文件尺寸被限制为 2GB 的操作系统上。
InnoDB 默认地被包含在 MySQL 二进制分发中。Windows Essentials installer 使 InnoDB 成为 Windows 上 MySQL 的默认表。
InnoDB 被用来在众多需要高性能的大型数据库站点上产生。著名的 Internet 新闻站点 Slashdot.org 运行在 InnoDB 上。 Mytrix, Inc. 在 InnoDB 上存储超过 1TB 的数据,还有一些其它站点在 InnoDB 上处理平均每秒 800 次插入 / 更新的
mysql 性能优化(二)今天突然看到一年前写的 mysql 优化(一) ,感觉有些误人子弟。今天再补充一些东西。 关于引擎选择,从理论上 和 实际上 可能会有差距,所以,对待 mysql 要有实验精神。 一般来说, MYisam 适合: 1. 做很多 count 的计算。 2. 插入不平凡,查询非常频繁。 3. 没有事务
innordb 非常适合: 1. 可靠性要求比较高,或者要求事务。 2. 表更新和查询都相当的频繁,并且表锁定的机会比较大的情况。
当然这也不是绝对的。要试验过才知道。 很多时候,性能瓶颈不是因为服务器配置不好,而是因为 SQL 不是很好。SQL 的性能优化是关键。 除了这些常见的优化方法, 还可以考虑 使用内存表。你测试一张 myisam 和 内存表,会发现速度差不多。 其实,在并发比较强的时候,性能会相差大概五倍。我有张经常要查询的 IP 地址 和 地区的 对应表,放入内存后。 以前查询 5000 个 IP 地址大概 要 15S, 现在,只要 2S 多。 很多东西,实际测试过才知道。用什么压力测试,测试出来的也不是很准确。
来源: http://blog.csdn.net/nightelve/article/details/17589883