`
ncisoft
  • 浏览: 29624 次
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

MySQL InnoDB 的性能问题讨论

阅读更多
MySQL最为人垢病的缺点就是缺乏事务的支持,MyISAM 性能虽然出众,不是没有代价的,InnoDB 又如何呢?InnoDB 的磁盘性能很令人担心,MySQL 缺乏良好的 tablespace 真是天大的缺陷!

InnoDB的表空间分成三种,一种是裸设备,一种是若干个 ibdata 文件(缺省方式),再一种是 Per-Table 文件,第一种用得少,第二种显然比第三种效率更差,本文的讨论基于 Per-Table,也即 innodb_file_per_table 配置参数。

现象重现:导出一个几百万行数据、带若干索引、有过频繁更新的表出来再导入,如果能以真实环境下的表来做测试就更理想,到 data 目录下观察对应的数据文件的 size 增长情况,会发现前 1G 速度相当令人满意,可是越往后效率越低,到后面基本就是蜗牛般的速度了。

不是只有导入才会让你慢得受不了,alter column/index 都会这样。。。

InnoDB 跟磁盘相关的文件存储,可以分成两个部分,一个是日志文件,另一个是数据文件。当有频繁的 INSERT/UPDATE 操作的时候,InnoDB 需要分别写入这两个文件,日志文件是顺序操作,数据文件包括了表数据和索引数据两个部分(和 MyISAM 直接拆开成表文件和索引文件不同,InnoDB 的表和索引是在同一个文件当中的)。

InnoDB 的索引用的是 BTREE 格式,如果当前更新的记录影响到索引的变化,逻辑上就存在三个操作,从原来的 BTREE 找到并摘除原来这行的记录并做调整、插入行数据、根据新数据查找 BTREE 相应的位置并重新插入新索引信息,假设索引数为 N,相应的逻辑操作数就为 1 + 2*N,显然这些信息不能保证在同一个磁盘连续空间上,因此需要 1 + 2*N 次的磁头移动,行数越大、文件尺寸越大,磁头的移动幅度也就可能越大,带来的后果显然是极差的磁盘 IO 效率。

MySQL 对于 MyISAM 的的磁盘 IO 优化是如何建议的呢?使用符号链接将表文件和索引文件分别指向不同的不同的目录,分散到不同的磁盘上以增加系统的访问速度。这种优化方式,在 InnoDB 上完全没有可能性!

如果有 tablespace 支持,磁盘效率问题就好解决了,一如商业数据库的做法,将日志、表文件、索引文件分别分布到不同的表空间也就是物理磁盘上,可是 MySQL 一直到 5.1 都没有提供 tablespace 功能,仅在 NDB/NDBCLUSTER 中才提供,但是 -- "CREATE TABLESPACE was added in MySQL 5.1.6. In MySQL 5.1, it is useful only with Disk Data storage for MySQL Cluster."。

不知道 Yahoo 等大网站是怎么解决这个难题的。。。头痛。。。考虑切换到 PostgreSQL 中。。。
分享到:
评论
10 楼 ncisoft 2006-11-17  
光说不练没用的,有条件的朋友可以自己去试验,我在这里置疑的不是 MyISAM,连交易都不支持,就不讨论了,也不是查询,是 InnoDB 下的 Insert/Update/Remove 性能,Cache 只能解决小数据量的问题,大数据量是不够的,RAID 0+1 能解决问题吗,看有没有机会做个试验吧,我比较怀疑,没经历过导入几百万条 InnoDB 数据到最后看着文件尺寸 100KB 100KB 的增长,是没法体会痛苦的。

btw,MySQL 我前前后后断断续续用了 7 年。。。
9 楼 bigpanda 2006-11-17  
lgn21st 写道
题外话!有一个地方不太明白,MySQL提供的MaxDB从介绍上看来,性能,稳定性等各方面都有无可比拟的优势
但是在好几个论坛上数据库板块很少有人讨论,不知为何maxdb的人气这么差


资料太少,去网上翻一圈,资料少的可怜。我九月底在amazon订了一本书,MaxDB for enterprise,几次延期,现在还没拿到。

抓下来代码看一看,光搭个build environment就要用到perl,python。这两门语言我都不会,就没有深究下去。现在别的事忙得很,以后再有时间研究吧。

我对MaxDB的兴趣是很大的,SAP做的东西,用来跑SAP系统的,并发事务处理的效率肯定不低。

现在InnoDB给Oracle买去了,MySQL应该会在MaxDB上下更大功夫的。

兄弟也对MaxDB感兴趣?
8 楼 charon 2006-11-17  
postgresql如果做了适当的索引和优化,一般情况下性能也够用了。但是postgresql的功能点和成熟度上比mysql强太多了,基本上和oracle有一拼.
关键的一点,postgresql是BSD类许可证的,商业上应用没有心理负担。
7 楼 LucasLee 2006-11-17  
而且,PostgreSql就性能来说,在网上一般的比较资料中,都是比MySQL低的。所以不能单纯比较一项功能是否支持,就得出性能是否好的结论吧。
6 楼 LucasLee 2006-11-17  
我觉得磁盘IO问题可以有很多方法解决吧,不一定局限于tablespace。比如透明的使用RAID,不就提高了磁盘性能了么?
5 楼 lgn21st 2006-11-17  
题外话!有一个地方不太明白,MySQL提供的MaxDB从介绍上看来,性能,稳定性等各方面都有无可比拟的优势
但是在好几个论坛上数据库板块很少有人讨论,不知为何maxdb的人气这么差
4 楼 nihongye 2006-11-17  
http://forum.mysqlperformanceblog.com/s/t/17/
http://software.newsforge.com/article.pl?sid=04/12/27/1243207
看看,有些建议。

http://dev.mysql.com/doc/refman/5.0/en/estimating-performance.html
按照这篇说的一个500,000的表,在没有cache的情况下,命中一条记录需要磁盘操作数:
log(500,000)/log(1024/3×2/(3+4)) + 1 = 4 seeks.
写入需要:4seeks查找,两次seeks进行更新索引和写入行。

所以对于大表:1.有足够多的内存做index的cache。2.避免全表检索。
3 楼 ncisoft 2006-11-17  
参考 PostgreSQL 的语法:

CREATE [ UNIQUE ] INDEX name ON table [ USING method ]
    ( { column | ( expression ) } [ opclass ] [, ...] )
    [ TABLESPACE tablespace ]
    [ WHERE predicate ]


CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name ( [
  { column_name data_type [ DEFAULT default_expr ] [ column_constraint [ ... ] ]
    | table_constraint
    | LIKE parent_table [ { INCLUDING | EXCLUDING } DEFAULTS ] }
    [, ... ]
] )
[ INHERITS ( parent_table [, ... ] ) ]
[ WITH OIDS | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE tablespace ]

在创建表、索引的时候,分别创建到不同的表空间,并将表空间放在不同的磁盘上,Oracle 也可以是同样的处理。

InnoDB 的日志文件是好优化,除了 robbin 说的,还可以指定日志文件的路径,和数据文件分布在不同的磁盘上,可是数据文件无法优化磁盘性能。
2 楼 together 2006-11-17  
oracle的索引,也是可以单独指定表空间的。

既然mysql暂时没有tablespace,那就优化一下磁盘性能好了。换更高转速更大缓存的硬盘设备,效果能好一些?

我们公司的一个mysql数据库是用的isam,现在已经有十个左右百万级的大表,性能还可以。不过商业应用采用mysql真是天生的失败,没有databaselink,需要和其它数据库交互的时候非常的麻烦。
1 楼 robbin 2006-11-17  
日志文件还是比较好优化的,一则可以去掉默认写入的bin-log,不让他写update的log,二则在my.cnf里面开大log buffer,减少log flush次数:

innodb_log_buffer_size = 1M
innodb_flush_log_at_trx_commit = 0

其实Oracle数据库也是每个tablespace一个数据库表文件的,而且数据和索引也是写在一起的,不知道oracle是怎么存储的。

MySQL的表我尚未在生产环境中使用到百万级别,现在JavaEye也就10万级别的记录,速度很快,所以我还不知道到百万级别会碰到你说的问题。



相关推荐

    MySQL 和 InnoDB 性能

    ### MySQL与InnoDB性能分析 #### MySQL架构概览 MySQL是一种关系型数据库管理系统,由瑞典MySQL AB公司开发,目前由Oracle公司维护。MySQL的核心组成部分包括服务器端、存储引擎以及一系列支持服务。 - **服务器...

    MySQL Innodb 索引原理详解

    在深入探讨MySQL Innodb索引之前,我们先了解几种基本的树形数据结构,包括二叉搜索树、B树、B+树以及B*树。 ##### 1.1 搜索二叉树(Binary Search Tree) 搜索二叉树是一种特殊的二叉树,每个节点至多有两个子...

    MySQL体系结构及原理(innodb)图文完美解析

    在深入探讨MySQL的体系结构及其核心组件InnoDB之前,我们先来理解几个基础概念。 1. **MySQL简介** MySQL是一种开源的关系型数据库管理系统(RDBMS),广泛应用于Web应用和其他软件系统中。它支持SQL(Structured ...

    MySQL InnoDB 查询优化实现分析

    - **附录四**:列举了一些实际应用中的案例研究,展示了如何利用 InnoDB 的特性来解决具体的性能问题。 通过本文的详细解析,读者可以对 MySQL + InnoDB 存储引擎在查询优化方面的工作原理有更深入的理解,并能够在...

    MySQL内核:InnoDB存储引擎 卷1.pdf.zip

    深入学习《MySQL内核:InnoDB存储引擎 卷1》,读者可以了解到InnoDB的内部工作机制,如如何处理B+树索引、事务的提交与回滚、锁的实现以及内存管理等内容,这对于优化数据库性能、解决并发问题、设计高效的数据模型...

    MySQL技术InnoDB存储引擎_姜承尧_第2版

    另外,InnoDB的缓冲池(Buffer Pool)管理、自适应哈希索引(Adaptive Hash Index)、双写缓冲(Double Write Buffer)和redo log等机制也会有详尽的解释,这些都是理解InnoDB性能的关键。 此外,书中会讨论InnoDB...

    MySQL技术内幕 InnoDB存储引擎.pptx

    此外,本书还对InnoDB的性能优化进行了详细的分析,提出了很多针对InnoDB性能优化的最佳实践,例如合理设计表结构、选择合适的索引、调整事务隔离级别等。 本书还对MySQL 6版本中InnoDB的改进进行了全面的介绍。与...

    MySQL InnoDB小结1

    本文将深入探讨InnoDB的特性和事务处理的ACID属性。 首先,事务是数据库操作的基础单元,它们确保了数据库操作的原子性、一致性、隔离性和持久性。原子性意味着事务中的所有操作要么全部执行,要么全部不执行,不...

    MySQL参考手册和InnoDB存储引擎技术手册 PDF格式

    这些书籍将深入探讨MySQL的架构、性能优化和高可用性策略。 《MySQL技术内幕InnoDB存储引擎》专注于InnoDB存储引擎的内部工作原理,涵盖了表空间、索引结构(包括B+树)、行格式、事务处理、锁定机制、故障恢复等...

    mysql高性能---mysql数据库的性能调优

    本篇将围绕“MySQL高性能—数据库的性能调优”这一主题,深入探讨如何优化MySQL的性能,提升系统整体效率。 首先,性能优化主要涉及以下几个方面: 1. **查询优化**:高效的SQL查询是性能提升的关键。这包括避免全...

    高性能MySQL.pdf

    《高性能MySQL》是一本深入探讨MySQL数据库系统优化与管理的经典著作。这本书涵盖了MySQL的架构、历史、性能调优以及基准测试等多个重要主题,对于数据库管理员、开发人员以及对数据库性能有高要求的技术人员来说,...

    mysql 高性能优化

    在《MySQL高性能优化》这本书中,作者深入浅出地探讨了如何最大限度地提升MySQL数据库的运行效率,确保系统的高可用性和高性能。 一、索引优化 索引是MySQL数据库性能的关键因素。正确地创建和使用索引可以显著提高...

    mysql 性能优化与架构设计(word版)

    本资料提供了一个全面的视角,深入探讨了如何优化MySQL的性能并进行有效的架构设计。 一、MySQL性能优化 1. 查询优化:查询优化是性能提升的关键。通过编写高效的SQL语句,避免全表扫描,使用索引,减少JOIN操作,...

    innodb插件mysql

    本文将深入探讨InnoDB Plugin与MySQL的结合,以及在innodb_plugin-1.0.6.tar.gz工具中如何使用和配置这个插件。 一、InnoDB Plugin的核心改进 1. **性能提升**:InnoDB Plugin引入了新的数据页压缩技术,可以减少...

Global site tag (gtag.js) - Google Analytics