Innodb关键特性:插入缓冲,两次写,自适应哈希索引. ->性能 与可靠性.
二次写
由二部分组成,一部分由内存中的doublewrite buffer大小为2MB,另一个部分是物理磁盘上共享表空间中连续的128个页,即二个区extent,即也是2MB. 当缓冲池的脏页刷新时,并不直接写磁盘,通过memcpy函数将脏页拷到内存中的doublewrite buffer中,再通过它分二次,每次写1MB到共享空间表的物理磁盘上. 在完成doublewrite页的写入后再将doublewrite页写入各个表空间中.
show global status like 'innodb_dblwr%'\G;在ZFS这样的提供写失效的防范机制的文件系统不需要开启二次写功能.
Master主服务器,要确保 开启.
,
自适应哈希
哈希是非常快的查找方法,一般情况时间复杂度为O(1).常用于连接查询,SqlServer ,Oracle的哈希连接hash join.但它们并不支持哈希索引.Mysql Heap引擎的默认索引类型为哈希.而Innodb提供另一种实现:自适应哈希.启用后,读取写入速度提高2倍,对于辅助索引的连接操作,性能可提高5倍.其设计思想是自优化,不需要DBA调整.
innodb_adaptive_hash_index来禁用或者启动此特性.默认为开启
INNODB与MySQL一样,GNU GPLv2下发布;
InnoDB有多个内存块,可认为这些内存块组成了大的内存池,完成如下工作:
1.维护所有进程/线程需要访问的多个内部数据结构;
2.缓存磁盘上数据,方便快速读取;
3.重做日志缓冲。
后台线程主要作用是负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据,将已修改的数据文件刷新到磁盘文件。
默认情况下,InnoDB存储引擎有7个后台线程。4个IO,1个master,一个锁监控,一个错误监控。IO线程的数量由配置文件中innodb_file_io_threads参数控制,默认4
show engine innodb status\G;
InnoDB
FROM:http://dev.mysql.com/doc/refman/5.1/zh/storage-engines.html#innodb-configuration
InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。InnoDB存储它的表&索引在一个表空间中,表空间可以包含数个文件(或原始磁盘分区)。
InnoDB 表可以是任何尺寸,即使在文件尺寸被限制为2GB的操作系统上。
在InnoDB上存储超过1TB的数据,还有一些其它站点在InnoDB上处理平均每秒800次插入/更新的负荷。
InnoDB存储引擎管理的两个重要的基于磁盘的资源是InnoDB表空间数据文件和它的日志文件。
如无InnoDB配置选项,MySQL将在MySQL数据目录下创建一个名为ibdata1的10MB大小的自动扩展数据文件,以及两个名为ib_logfile0和ib_logfile1的5MB大小的日志文件。
明确创建的具有相同特征的表空间作为默认设置的设置操作如下:
[mysqld]
innodb_data_file_path=ibdata1:10M:autoextend
这个设置配置一个可扩展大小的尺寸为10MB的单独文件,名为ibdata1。没有给出文件的位置,所以默认的是在MySQL的数据目录内。
尺寸大小用M或者G后缀来指定说明单位是MB或者GB。
一个表空间,它在数据目录里包含一个名为ibdata1的固定尺寸50MB的数据文件和一个名为ibdata2大小为50MB的自动扩展文件,其可以 像这样被配置:
[mysqld]
innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend
指定最大大小
[mysqld]
innodb_data_file_path=ibdata1:10M:autoextend:max:500M
指定目录
InnoDB默认地在MySQL数据目录创建表空间文件。要明确指定一个位置,请使用innodb_data_home_dir选项。比如,要使用两个名为ibdata1和ibdata2的文件,但是要把他们创建到/ibdata, 像如下一样配置InnoDB:
[mysqld]
innodb_data_home_dir = /ibdata
innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend
注释:InnoDB不创建目录,所以在启动服务器之前请确认/ibdata目录的确存在。
[mysqld]
# You can write your other MySQL server options here
innodb_data_home_dir =
# You can write your other MySQL server options here
# ...
# Data files must be able to hold your data and indexes.
# Make sure that you have enough free disk space.
innodb_data_file_path = ibdata1:10M:autoextend
#innodb_data_file_path = /ibdata/ibdata1:2000M;/dr2/ibdata/ibdata2:2000M:autoextend
#
# Set buffer pool size to 50-80% of your computer's memory,
# but make sure on Linux x86 total memory usage is < 2GB
innodb_buffer_pool_size=1G
innodb_additional_mem_pool_size=20M
innodb_log_group_home_dir = /dr3/iblogs
#
innodb_log_files_in_group = 2
#
# Set the log file size to about 25% of the buffer pool size
innodb_log_file_size=250M
innodb_log_buffer_size=8M
#
innodb_flush_log_at_trx_commit=1
innodb_lock_wait_timeout=50
#
# Uncomment the next lines if you want to use them
#innodb_thread_concurrency=5
#
# Set buffer pool size to 50-80% of your computer's memory
#set-variable = innodb_buffer_pool_size=70M
#set-variable = innodb_additional_mem_pool_size=10M
#
# Set the log file size to about 25% of the buffer pool size
#set-variable = innodb_log_file_size=20M
#set-variable = innodb_log_buffer_size=8M
所有数据不被放置在同一物理磁盘上,这样将改善数据库的性能。把日志文件放在与数据文件不同的磁盘上对性能是经常很有好处的。
在32位GNU/Linux x86上,你必须要小心不要设置过高的内存用量。glibc可能允许进程堆积在线程堆栈上发展,它会造成你的服务器崩溃。如果下列表达式的值接近或者超过2GB,系统会面临危机:
innodb_buffer_pool_size+ key_buffer_size+ max_connections*(sort_buffer_size+read_buffer_size+binlog_cache_size)+ max_connections*2MB
每个线程使用一个堆栈(通常是2MB,但在MySQL AB二进制分发版里只有256KB)并且在最坏的情况下也使用sort_buffer_size + read_buffer_size附加内存。
你可以自己编译MySQL,在32位Windows上使用高达64GB物理内存。 “InnoDB启动选项”里对innodb_buffer_pool_awe_mem_mb的描述。
如何调整其它mysqld服务器参数[典型]
[mysqld]
skip-external-locking
max_connections=200
read_buffer_size=1M
sort_buffer_size=1M
#
# Set key_buffer to 5 - 50% of your RAM depending on how much you use MyISAM tables, but keep key_buffer_size + InnoDB buffer pool size < 80% of your RAM
key_buffer_size=value
相关推荐
### MySQL Innodb 索引原理详解 #### 1. 各种树形结构 在深入探讨MySQL Innodb索引之前,我们先了解几种基本的树形数据结构,包括二叉搜索树、B树、B+树以及B*树。 ##### 1.1 搜索二叉树(Binary Search Tree) ...
mysql innodb类型数据库表 根据ibd文件获取表 space id,用于恢复innodb类型数据表数据
MySQL InnoDB Cluster是一种高可用性解决方案,用于在MySQL 8中构建分布式数据库系统。它基于InnoDB存储引擎,提供了一种自动化的故障切换和数据复制功能,确保即使在单个节点故障时,整个集群也能保持运行。以下是...
### MySQL InnoDB 查询优化实现分析 #### 一、目的与背景 本文旨在深入探讨 MySQL + InnoDB 存储引擎在实现查询优化时所采取的方法及其内部机制。通过具体实例和详细的技术解析,揭示 InnoDB 如何高效处理各种查询...
这是我从网上找到的mysql/mariadb对innodb表进行数据恢复的工具,实现从innodb的数据库文件中恢复数据,用于实现下面情况:1、直接下载了innodb数据库的文件,而不是导出其数据,想恢复数据时(需要有完整的文件,...
MySQL InnoDB 技术内幕 MySQL InnoDB 存储引擎是 MySQL 关系数据库管理系统中最常用的存储引擎之一。InnoDB 存储引擎是 MySQL 的默认存储引擎,它提供了高性能、高可靠性的存储功能。 数据库和实例的区别 -------...
### MySQL Innodb 引擎特性详解 #### 一、MySQL Innodb 引擎概述 MySQL是一种广泛使用的开源关系型数据库管理系统(RDBMS),它提供了多种存储引擎以满足不同场景的需求。其中,InnoDB是最常用的一种存储引擎之一,...
### MySQL Innodb 参数详解与优化实践 #### 一、引言 MySQL作为一款广泛使用的开源关系型数据库管理系统,其InnoDB存储引擎因其高可靠性和事务处理能力而备受青睐。为了充分发挥InnoDB的优势并针对特定场景进行性能...
### MySQL Innodb 存储引擎表存储分析 #### 概述 MySQL的InnoDB存储引擎是一种广泛使用的事务处理引擎,支持行级锁定和外键约束等功能。本文将深入解析InnoDB存储引擎中的表存储机制,重点介绍其如何管理和存储数据...
MySQL InnoDB性能优化的学习总结涉及了多个关键知识点,下面将对这些知识进行详细说明: 1. **参数配置与优化**: - **innodb_buffer_pool_size**:InnoDB的缓冲池大小,建议设置为系统内存的60%至80%,以便将数据...
Mysql innodb存储引擎内幕,作者姜承旭
### MySQL InnoDB 源码实现分析 #### 查询优化 查询优化是数据库系统的重要组成部分,其目的是找到最有效的数据检索方式。在InnoDB存储引擎中,查询优化涉及到多个环节,包括但不限于选择合适的索引、估计查询成本...
MySQL的InnoDB存储引擎在处理并发事务时可能会遇到死锁问题,这主要发生在多个事务互相等待对方释放资源的情况下。死锁通常由四个必要条件引发: 1. 互斥条件:资源只能被一个事务使用。 2. 请求和保持条件:一个...