今天研究下关于mysql数据的相关参数以及innodb引擎下的共享表空间和独立表空间介绍,
参数主要包括innodb_data_file_path、innodb_data_home_dir、innodb_buffer_pool_size、innodb_buffer_pool_instances四个参数。
一:首先介绍innodb_buffer_pool_size 咱们知道mysql数据库在操做数据页的时候,会先把数据页pin到内存中,以后再作相关的处理,那么mysql可使用的mysql的内存大小就是由innodb_buffer_pool_size参数控制的,
这个参数主要做用是缓存innodb表的索引,数据,插入数据时的缓冲。在高并发高I/O时正确的配置很是重要,可能带来很大的性能提高,这是InnoDB最重要的设置,对InnoDB性能有决定性的影响。
默认的设置只有8M,因此默认的数据库设置下面InnoDB性能不好。在只有 InnoDB存储引擎的数据库服务器上面,能够设置60-80%的内存。这个参数是非动态的,要修改这个值,须要重启mysqld服务
# InnoDB, unlike MyISAM, uses a buffer pool to cache both indexes and # row data. The bigger you set this the less disk I/O is needed to # access data in tables. On a dedicated database server you may set this # parameter up to 80% of the machine physical memory size. Do not set it # too large, though, because competition of the physical memory may # cause paging in the operating system. Note that on 32bit systems you # might be limited to 2-3.5G of user level memory per process, so do not # set it too high. #innodb,不像myisam,使用缓冲池来缓存索引和 #行数据。您设置的越大,那么访问表中的数据所需的磁盘I /o就越少。 #在专用的数据库服务器上,您能够设置这个 #参数最多80%的计算机物理内存大小。不要设置它 #太大了,由于物理内存的竞争可能 #致使操做系统中的分页。注意,在32位系统上 #可能仅限于每一个进程的2-3.5g用户级内存,因此不要 把它定得过高了。
二:innodb_data_home_dir和innodb_data_file_path参数 innodb_data_file_path用来指定innodb 共享 表空间文件,若是咱们不在My.cnf文件中指定innodb_data_home_dir和innodb_data_file_path那么默认会在datadir目录下建立ibdata1
做为innodb tablespace。 虽然不指定innodb_data_home_dir和指定它为空显示是同样的,可是做用确不同,若是不指定那么全部的innodb tablespace 文件只能存放在datadir目录下。
若是显示指定为空,则能够为innodb tablespace 文件指定不一样的路径 1. 在同一个路径下指定多个innodb tablespace 文件 1) 在my.cnf文件指定以下 [mysqld] innodb_data_file_path = ibdata1:1G;ibdata2:12M:autoextend:max:500M note:The autoextend and max attributes can be used only for the last data file in the innodb_data_file_path line. note:由于没有指定innodb_data_home_dir,因此ibdata1和ibdata2都在datadir(innodb_data_home_dir默认值为datadir)目录下建立 2) 在my.cnf文件指定以下 [mysqld] innodb_data_home_dir = /data/mysql/mysql3306/data innodb_data_file_path = ibdata1:1G;ibdata2:12M:autoextend:max:500M note:能够显示的指定innodb tablespace文件的路径,若是指定innodb_data_home_dir,那么就不能为innodb tablespace不一样文件指定不一样路径 2. 在不一样路径下指定innodb tablespace 在my.cnf文件下指定 [mysqld] innodb_data_home_dir = innodb_data_file_path = ibdata1:12M;/data/mysql/mysql3306/data1/ibdata2:12M:autoextend note:若是想为innodb tablespace指定不一样目录下的文件,必须指定innodb_data_home_dir =。这个例子中会在datadir下创建ibdata1,在/data/mysql/mysql3306/data1/目录下建立ibdata2 若是我不指定innodb_data_home_dir =,只在my.cnf文件中作以下指定: innodb_data_file_path =/data/data/ibdata1:18m;/data/data/1ibdata2:100m:autoextend:max:2000M bogon:root@~>service mysqld start Starting MySQL. ERROR! The server quit without updating PID file (/tmp/mysql.pid). 查看错误日志。。。以下 bogon:root@/>tail -n 100 /data/log/error.log
171127 21:08:16 InnoDB: Operating system error number 2 in a file operation. InnoDB: The error means the system cannot find the path specified. InnoDB: If you are installing InnoDB, remember that you must create InnoDB: directories yourself, InnoDB does not create them. InnoDB: File name .//data/data/ibdata1 InnoDB: File operation call: 'create'. InnoDB: Cannot continue operation. ##因此若是想为innodb tablespace文件指定不一样路径,那么必须在my.cnf文件中指定innodb_data_home_dir = 注意: 1)设定文件大小时必定要注意你的OS是否有最大文件尺寸为2GB的限制!InnoDB是不会注意你的OS文件尺寸限制的, 在一些文件系统中你可能要设定最大容量限制: innodb_data_home_dir = innodb_data_file_path = /ibdata/ibdata1:100M:autoextend:max:2000M 2)若是是修改共享表空间的文件个数,注意在描述原来文件的时候,必定要找到该文件,查看他当前的实际大小,而后写在innodb_data_file_path =哪一个文件的后面。不然会报错。
三:innodb_buffer_pool_instances innodb缓冲池被划分为多个内存缓冲池的数量。对于具备多GB范围的缓冲池的系统,将缓冲池划分为多个缓冲池能够提升并发性,减小对不一样线程读取和写入到缓存时页面的争用。
从缓冲池中存储或读取的每一个页面都随机分配给其中一个缓冲池实例,使用哈希函数。每一个缓冲池管理本身的自由列表、刷新列表、LRU和链接到缓冲池的全部其余数据结构,
并由本身的buffer pool mutex(互斥体)保护。 只有当您将innodb _ buffer _ pool _size设置为1gb或更高的大小时,此选项才会生效。全部缓冲池的大小之和是您指定的总的缓存池大小。
为了得到最佳效率,请指定innodb _ buffer _ pool _instances和innodb _ buffer _ pool _size的组合,以便每一个缓冲池实例至少为1gb。 在MySQL 5.6.6以前,默认是1, 默认值 在MySQL 5.6.6和更高版本在32位系统取决于innodb_buffer_pool_size的值 1 innodb_buffer_pool_instances能够开启多个内存缓冲池,把须要缓冲的数据hash到不一样的缓冲池中,这样能够并行的内存读写。 2 innodb_buffer_pool_instances 参数显著的影响测试结果,特别是很是高的 I/O 负载时。 3 实验环境下, innodb_buffer_pool_instances=8 在很小的 buffer_pool 大小时有很大的提高,而使用大的 buffer_pool 时,innodb_buffer_pool_instances=1 的表现最棒。
最后说说mysql的innodb引擎下的表空间:
1、针对innodb引擎,分为两种状况一种是共享表空间存储方式,还有一种是独享表空间存储方式。 共享表空间: Innodb的全部数据保存在一个单独的表空间里面,而这个表空间能够由不少个文件组成,一个表能够跨多个文件存在,因此其大小限制再也不是文件大小的限制,而是其自身的限制。
从Innodb的官方文档中能够看到,其表空间的最大限制为64TB,也就是说,Innodb的单表限制基本上也在64TB左右了,固然这个大小是包括这个表的全部索引等其余相关数据。 独立表空间: 而当使用独享表空间来存放Innodb的表的时候,每一个表的数据以一个单独的文件来存放,这个时候的单表限制,又变成文件系统的大小限制了 针对myasam引擎: MySQL单表最大限制就已经扩大到了64PB了(官方文档显示)。也就是说,从目前的技术环境来看,MySQL数据库的MyISAM存储 引擎单表大小限制已经不是有MySQL数据库自己来决定,
而是由所在主机的OS上面的文件系统来决定了。
2、查看数据库的表空间 MySQL [(none)]> show variables like 'innodb_data%'; +-----------------------+----------------------------------------------------------------------+
| Variable_name | Value |
+-----------------------+----------------------------------------------------------------------+
| innodb_data_file_path | /data/data/ibdata1:100m;/data/data1/ibdata2:100m:autoextend:max:2000M |
| innodb_data_home_dir | |
+-----------------------+----------------------------------------------------------------------+
表空间有四个文件组成:ibdata一、ibdata2每一个文件的大小为100M,当ibdata1文件满了的时候,ibdata2会自动扩展; 当前的存储空间满的时候,能够在其余的磁盘添加数据文件,语法以下:语法以下所示: pathtodatafile:sizespecification;pathtodatafile:sizespec;.;pathtodatafile:sizespec[:autoextend[:max:sizespecification]] 若是用 autoextend 选项描述最后一个数据文件,当 InnoDB 用尽全部表自由空间后将会自动扩充最后一个数据文件,每次增量为 8 MB。示例: 无论是共享表空间和独立表空间,都会存在innodb_data_file文件,由于这些文件不只仅要存放数据,并且还要充当着相似于ORACLE的UNDO表空间等一些角色。 3、共享表空间优缺点 既然Innodb有共享表空间和独立表空间两种类型,那么这两种表空间存在确定都有时候本身的应用的场景,存在即合理。如下是摘自mysql官方的一些介绍: 3.1 共享表空间的优势 表空间能够分红多个文件存放到各个磁盘,因此表也就能够分红多个文件存放在磁盘上,表的大小不受磁盘大小的限制,方便扩容,放到多个磁盘磁盘上能够分散io,提升性能。 3.2 共享表空间的缺点 全部的数据和索引存放到一个文件,虽然能够把一个大文件分红多个小文件,可是多个表及索引在表空间中混合存储,当数据量很是大的时候,表作了大量删除操做后表空间中将会有大量的空隙,
特别是对于统计分析,日志系统这类应用最不适合用共享表空间,对于常常删除操做的这类应用最不适合用共享表空间。 共享表空间分配后不能回缩:当出现临时建索引或是建立一个临时表的操做表空间扩大后,就是删除相关的表也没办法回缩那部分空间了
(能够理解为oracle的表空间10G,可是才使用10M,可是操做系统显示的表空间为10G),进行数据库的冷备很慢;
4、独立表空间的优缺点 4.1 独立表空间的优势 每一个表都有自已独立的表空间,每一个表的数据和索引都会存在自已的表空间中,能够实现单表在不一样的数据库中移动。 空间能够回收(除drop table操做外,表空不能自已回收) Drop table操做自动回收表空间,若是对于统计分析或是日志表,删除大量数据后能够经过:alter table TableName engine=innodb;回缩不用的空间。 对于使innodb-plugin的Innodb使用turncate table也会使空间收缩。 对于使用独立表空间的表,无论怎么删除,表空间的碎片不会太严重的影响性能; 4.2 独立表空间的缺点 单表增长过大,当单表占用空间过大时,存储空间不足,只能从操做系统层面思考解决方法,好比作软链接; 5、共享表空间和独立表空间之间的转换 5.1 查看当前数据库的表空间管理类型 mysql> show variables like "innodb_file_per_table"; ON表明独立表空间管理,OFF表明共享表空间管理;(查看单表的表空间管理方式,须要查看每一个表是否有单独的数据文件) 5.2 修改数据库的表空间管理方式 修改innodb_file_per_table的参数值便可,可是修改不能影响以前已经使用过的共享表空间和独立表空间; innodb_file_per_table=1 为使用独占表空间 innodb_file_per_table=0 为使用共享表空间 题外话 碎片的产生: MySQL具备至关多不一样种类的存储引擎来实现列表中的数据存储功能。每当MySQL从你的列表中删除了一行内容,该段空间就会被留空。而在一段时间内的大量删除操做,
会使这种留空的空间变得比存储列表内容所使用的空间更大。当MySQL对数据进行扫描时,它扫描的对象实际是列表的容量需求上限,也就是数据被写入的区域中处于峰值位置的部分。
若是进行新的插入操做,MySQL将尝试利用这些留空的区域,但仍然没法将其完全占用。 针对oracle行连接和行迁移:新insert的时候,可能发生行连接;update已经存在的行时,可能发生行迁移; 行连接产生在第一次插入数据的时候若是一个block不能存放一行记录的状况下。这种状况下,Oracle将使用连接一个或者多个在这个段中保留的block存储这一行记录,
行连接比较容易发生在比较大的行上,例如行上有LONG、LONG RAW、LOB等数据类型的字段,这种时候行连接是不可避免的会产生的。 当一行记录初始插入的时候事能够存储在一个block中的,因为更新操做致使行长增长了,而block的自由空间已经彻底满了,这个时候就产生了行迁移。在这种状况下,Oracle将会迁移整行数据到一个新的block中(假设一个block中能够存储下整行数据),Oracle会保留被迁移行的原始指针指向新的存放行数据的block,这就意味着被迁移行的ROW ID是不会改变的。 当发生了行迁移或者行连接,对这行数据操做的性能就会下降,由于Oracle必需要扫描更多的block来得到这行的信息。 总结:原来mysql也有相似于oracle的undo表空间,也就是innodb共享表空间(ibdata1),默认就是自动扩展的,每次扩展8M,共享表空间相似于oracle的表空间,能够实现把mysql的数据和索引放到不一样的磁盘下,分散io,进而提升性能,就是不像oracle那样能够动态的给表空间添加文件,mysql若是想要添加共享表空间的文件,须要重启mysql服务才能生效。