mySQL InnoDB 的性能问题讨论
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 中。。
最新文章
- SharePoint 2013 版本号和相关问题介绍
- 1、ViewModel类的构建和INoyifyPropertyChanged的应用
- 解析$.grep()源码及透过$.grep()看(两次取反)!!的作用
- Windows7 下配置添加ASP功能
- 在Centos 5.x或6.x上安装RHEL EPEL Repo
- C++中的unordered_map
- net异步编程之await
- PE文件格式分析
- 构建微服务开发环境3————Java应用的优秀管理工具Maven的下载安装及配置
- Help Jimmy ~poj-1661 基础DP
- Java基本语法-----java变量
- Hive的原理
- VIM新手福利,配置向
- Money King【题解】
- Centos7下面配置客户端OpenVPN
- Eclipse配置MyBatis的xml自动提示【转】
- Expm 3_2 寻找最邻近的点对
- hive遇到FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask错误
- 20170906xlVBA_CopyDataAndFormatFromSheets
- bayes公式 - 再从零开始理解
热门文章
- 通过阅读python subprocess源码尝试实现非阻塞读取stdout以及非阻塞wait
- mysql主从复制常见故障解决
- Qt中的标准对话框之QMessageBox
- elasticsearch _script 脚本排序
- DS图--最小生成树
- STL中erase()的用法
- “Hello world! ”
- Linux下的Mysql安装 &; 配置
- [转][C#]WebAPI 必需 Dll
- centos7.0下增加swap分区大小