日期:2014-05-16  浏览次数:20397 次

Mysql innodb存储引擎的性能优化一

http://zauc.wordpress.com/category/mysql/

Mysql?innodb?performance?optimization

Mysql?innodb存储引擎的性能优化

本文翻译自http://www.mysqlperformanceblog.com/files/presentations/UC2007-Innodb-Performance-Optimization.pdf

这里只是我对这个PDF文件进行了翻译,由于本人刚从事mysql?DBA一职,所以很多东西自己并不能很好的翻译出来,其中对于硬件部分翻译的应该还行,但是关于数据库方面的翻译的不好,大家就看看吧,翻译本文只是想更?清楚的了解mysql?优化上的一些基本原则,而国内对于这个没有完整的资料。本文的作者Heikki?Tuuri是InnoDB的创始人,在翻译过程中同样获得了Peter?Zaitsev的帮助,他是《High?Performance?MySQL》一书的作者。

作者:?Heikki?Tuuri

Email:?

译者:?Timo?Seven

Email:?greycd@gmail.com

大家有什么意见可以给我邮件。

一切都从应用程序设计开始

1.?通用应用程序的设计是至关重要的

1.1.?设计你的schema,索引和查询,以及选择正确的存储引擎是常用的优化手段。

1.2.?在有些情况下存储引擎的选择会影响到schema和索引

1.3.?我们这里不会覆盖到一般的schema设计方法,但是会主要聚焦到Innodb存储引擎。

2.?每个存储引擎都是不同的

2.1.?MySQl提供多种存储引擎可供选择

2.2.?它们每个都有不同的设计和操作属性。

2.3.?一个给某个存储引擎写的应用程序可能在其它存储引擎下表现良好。

2.4.?每个存储引擎都有特定的优化方式,所以它们只对特定的设计模式有用。

2.5.?我们覆盖所有对于InnoDB存储引擎的做何不做。

3.?使用事务

3.1.?InnoDB默认就是使用事务,甚至你不知道如何使用。每句语句都将在自己的事务内(假设你运行“autocommit”模式set?autocommit=1),在每句语句后面都会自动增加commit语句。

3.2.?把多条update语句包装在同一个事务是更有效率的方式。(set?autcommit=0;..comit;…commit;)。不能让事务过长,这样会造成死锁和等待超时。

4.?不要使用锁表(lock?tables)

4.1.?锁表(LOCK?TABLES)是设计用来给那些表级锁的存储引擎。在行级锁的存储引擎中事务是更好的选择。InnoDB的的锁表行为在不同的mysql?版本是不同的,如果你从MySQL4.0或者更新的版本升级,那你依赖于innodb_table_locks这个选项会导致很多问题。

5.?主键簇

5.1.?主键是特殊的

5.1.1.?通过主键访问数据比通过其它key访问更快。无论是在内存还是磁盘通过主键查找都是最快的。

5.1.2.?数据都由主键聚集的。连续的主键值很容易让同一页主键的数据进行排序同时首字查询也会非常有效率。可用于把所有需要访问数据集中在一起。把用户信息存储在一起可以使用(user_id,message_id)作为主键来保存所有用户的信息在很多页中。主键是一个替代索引对于任何字段。

6.?主键的开销

6.1.?主键在随机排序是开销比较大的,也会导致表产生碎片(主键的插入一般都是根据升序进行的)

6.1.1.?如果可以装载数据都通过主键来进行排序的。