`

Mysql master && slave

 
阅读更多

 



 

InnoDB和MyISAM简介

MyISAM:这个是默认类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的 顺序访问方法) 的缩写,它是存储记录和文件的标准方法.与其他存储引擎比较,MyISAM具有检查和修复表格的大多数工具. MyISAM表格可以被压缩,而且它们支持全文搜索.它们不是事务安全的,而且也不支持外键。如果事物回滚将造成不完全回滚,不具有原子性。如果执行大量 的SELECT,MyISAM是更好的选择。

InnoDB:这种类型是事务安全的.它与BDB类型具有相同的特性,它们还支持外键.InnoDB表格速度很快.具有比BDB还丰富的特性,因此 如果需要一个事务安全的存储引擎,建议使用它.如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表,

对于支持事物的InnoDB类型的标,影响速度的主要原因是AUTOCOMMIT默认 设置是打开的,而且程序没有显式调用BEGIN 开始事务,导致每插入一条都自动Commit,严重影响了速度。可以在执行sql前调用begin,多条sql形成一个事物(即使autocommit打 开也可以),将大大提高性能。

===============================================================

InnoDB和MyISAM 两者之间的差别

InnoDB和MyISAM是在使用MySQL最常用的两个表类型,各有优缺点,视具体应用而定。

下面是已知的两者之间的差别,仅供参考。

innodb
InnoDB 给 MySQL 提供了具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。InnoDB 提供了行锁(locking on row level),提供与 Oracle 类型一致的不加锁读取(non-locking read in SELECTs)。这些特性均提高了多用户并发操作的性能表现。在InnoDB表中不需要扩大锁定(lock escalation),因为 InnoDB 的列锁定(row level locks)适宜非常小的空间。InnoDB 是 MySQL 上第一个提供外键约束(FOREIGN KEY constraints)的表引擎。

InnoDB 的设计目标是处理大容量数据库系统,它的 CPU 利用率是其它基于磁盘的关系数据库引擎所不能比的。在技术上,InnoDB 是一套放在 MySQL 后台的完整数据库系统,InnoDB 在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。 InnoDB 把数据和索引存放在表空间里,可能包含多个文件,这与其它的不一样,举例来说,在 MyISAM 中,表被存放在单独的文件中。InnoDB 表的大小只受限于操作系统的文件大小,一般为 2 GB。
InnoDB所有的表都保存在同一个数据文件 ibdata1 中(也可能是多个文件,或者是独立的表空间文件),相对来说比较不好备份,免费的方案可以是拷贝数据文件、备份 binlog,或者用 mysqldump。
MyISAM
MyISAM 是MySQL缺省存贮引擎 .

每张MyISAM 表被存放在三个文件 。frm 文件存放表格定义。 数据文件是MYD (MYData) 。 索引文件是MYI (MYIndex) 引伸。

因为MyISAM相对简单所以在效率上要优于InnoDB..小型应用使用MyISAM是不错的选择.

MyISAM表是保存成文件的形式,在跨平台的数据转移中使用MyISAM存储会省去不少的麻烦

以下是一些细节和具体实现的差别:

1.InnoDB不支持FULLTEXT类型的索引。
2.InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含 where条件时,两种表的操作是一样的。
3.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。
4.DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。
5.LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。

另外,InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”

任何一种表都不是万能的,只用恰当的针对业务类型来选择合适的表类型,才能最大的发挥MySQL的性能优势。

===============================================================

以下是InnoDB和MyISAM的一些联系和区别

1. 4.0以上mysqld都支持事务,包括非max版本。3.23的需要max版本mysqld才能支持事务。

2. 创建表时如果不指定type则默认为myisam,不支持事务。
可以用 show create table tablename 命令看表的类型。

2.1 对不支持事务的表做start/commit操作没有任何效果,在执行commit前已经提交,测试:
执行一个msyql:
use test;
drop table if exists tn;
create table tn (a varchar(10)) type=myisam;
drop table if exists ty;
create table ty (a varchar(10)) type=innodb;

begin;
insert into tn values(‘a’);
insert into ty values(‘a’);
select * from tn;
select * from ty;
都能看到一条记录

执行另一个mysql:
use test;
select * from tn;
select * from ty;
只有tn能看到一条记录
然后在另一边
commit;
才都能看到记录。

3. 可以执行以下命令来切换非事务表到事务(数据不会丢失),innodb表比myisam表更安全:
alter table tablename type=innodb;

3.1 innodb表不能用repair table命令和myisamchk -r table_name
但可以用check table,以及mysqlcheck [OPTIONS] database [tables]

4. 启动mysql数据库的命令行中添加了以下参数可以使新发布的mysql数据表都默认为使用事务(
只影响到create语句。)
–default-table-type=InnoDB

测试命令:
use test;
drop table if exists tn;
create table tn (a varchar(10));
show create table tn;

5. 临时改变默认表类型可以用:
set table_type=InnoDB;
show variables like ‘table_type’;
或:
c:\mysql\bin\mysqld-max-nt –standalone –default-table-type=InnoDB

=========================================================

详解“InnoDB”和“MyISAM”的不同之处

InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定。基本的差别为:MyISAM类 型 不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而 InnoDB提供事务支持已经外部键等高级数据库功能。

MyIASM是IASM表的新版本,有如下扩展:

·二进制层次的可移植性。

·NULL列索引。

·对变长行比ISAM表有更少的碎片。

·支持大文件。

·更好的索引压缩。

·更好的键吗统计分布。

·更好和更快的auto_increment处理。

以下是一些细节和具体实现的差别:

◆1.InnoDB不支持FULLTEXT类型的索引。

◆2.InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含 where条件时,两种表的操作是一样的。

◆3.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。

◆4.DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。

◆5.LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。

另外,InnoDB表的行锁也不是绝对的,假如在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”

综上所述,任何一种表都不是万能的,只有恰当的针对业务类型来选择合适的表类型,才能最大的发挥MySQL的性能优势。

=========================================================

MySQL中MyISAM引擎与InnoDB引擎性能简单测试

[硬件配置]
CPU : AMD2500+ (1.8G)
内存: 1G/现代
硬盘: 80G/IDE

[软件配置]
OS : Windows XP SP2
SE : PHP5.2.1
DB : MySQL5.0.37
Web: IIS6

[MySQL表结构]

CREATE TABLE `myisam` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(100) default NULL,
`content` text,
PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=gbk;

 

CREATE TABLE `innodb` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(100) default NULL,
`content` text,
PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;

[数据内容]

$name = “heiyeluren”;
$content = “MySQL支持数个存储引擎作为对不同表的类型的处理器。MySQL存储引擎包括处理事务安全表的引擎和处理非事务安全表的引擎:· MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。MyISAM在所有MySQL配置里被支持,它是默认的存储引擎,除非你配置 MySQL默认使用另外一个引擎。 ·MEMORY存储引擎提供“内存中”表。MERGE存储引擎允许集合将被处理同样的MyISAM表作为一个单独的表。就像MyISAM一 样,MEMORY和MERGE存储引擎处理非事务表,这两个引擎也都被默认包含在MySQL中。 释:MEMORY存储引擎正式地被确定为HEAP引擎。· InnoDB和BDB存储引擎提供事务安全表。BDB被包含在为支持它的操作系统发布的MySQL-Max二进制分发版里。InnoDB也默认被包括在所 有MySQL 5.1二进制分发版里,你可以按照喜好通过配置MySQL来允许或禁止任一引擎。·EXAMPLE存储引擎是一个“存根”引擎,它不做什么。你可以用这个 引擎创建表,但没有数据被存储于其中或从其中检索。这个引擎的目的是服务,在MySQL源代码中的一个例子,它演示说明如何开始编写新存储引擎。同样,它 的主要兴趣是对开发者。”;

[插入数据-1] (innodb_flush_log_at_trx_commit=1)
MyISAM 1W:3/s
InnoDB 1W:219/s

MyISAM 10W:29/s
InnoDB 10W:2092/s

MyISAM 100W:287/s
InnoDB 100W:没敢测试

[插入数据-2] (innodb_flush_log_at_trx_commit=0)
MyISAM 1W:3/s
InnoDB 1W:3/s

MyISAM 10W:30/s
InnoDB 10W:29/s

MyISAM 100W:273/s
InnoDB 100W:423/s

[插入数据3] (innodb_buffer_pool_size=1024M)
InnoDB 1W:3/s
InnoDB 10W:33/s
InnoDB 100W:607/s

[插入数据4] (innodb_buffer_pool_size=256M, innodb_flush_log_at_trx_commit=1, set autocommit=0)

InnoDB 1W:3/s
InnoDB 10W:26/s
InnoDB 100W:379/s

[MySQL 配置文件] (缺省配置)

# MySQL Server Instance Configuration File
[client]
port=3306

 

[mysql]
default-character-set=gbk

[mysqld]
port=3306
basedir=”C:/mysql50/”
datadir=”C:/mysql50/Data/”
default-character-set=gbk
default-storage-engine=INNODB
sql-mode=”STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION”
max_connections=100

query_cache_size=0
table_cache=256
tmp_table_size=50M
thread_cache_size=8
myisam_max_sort_file_size=100G
myisam_max_extra_sort_file_size=100G
myisam_sort_buffer_size=100M
key_buffer_size=82M
read_buffer_size=64K
read_rnd_buffer_size=256K
sort_buffer_size=256K

innodb_additional_mem_pool_size=4M
innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=2M
innodb_buffer_pool_size=159M
innodb_log_file_size=80M
innodb_thread_concurrency=8

【总结】

 

 

可 以看出在MySQL 5.0里面,MyISAM和InnoDB存储引擎性能差别并不是很大,针对InnoDB来说,影响性能的主要是 innodb_flush_log_at_trx_commit 这个选项,如果设置为1的话,那么每次插入数据的时候都会自动提交,导致性能急剧下降,应该是跟刷新日志有关系,设置为0效率能够看到明显提升,当然,同 样你可以SQL中提交“SET AUTOCOMMIT = 0”来设置达到好的性能。另外,还听说通过设置innodb_buffer_pool_size能够提升InnoDB的性能,但是我测试发现没有特别明显 的提升。

基本上我们可以考虑使用InnoDB来替代我们的MyISAM引擎了,因为InnoDB自身很多良好的特点,比如事务支持、存储 过程、视图、行级锁定等等,在并发很多的情况下,相信InnoDB的表现肯定要比MyISAM强很多,当然,相应的在my.cnf中的配置也是比较关键 的,良好的配置,能够有效的加速你的应用。

如果不是很复杂的Web应用,非关键应用,还是可以继续考虑MyISAM的,这个具体情况可以自己斟酌。

参考URL:

http://dev.mysql.com/doc/refman/5.1/zh/index.html

http://dev.mysql.com/doc/refman/5.1/zh/storage-engines.html#innodb

http://rtxbc.blog.163.com/blog/static/122893659201091783224157/

=========================================

 

  • 大小: 75.6 KB
分享到:
评论

相关推荐

    搭建MySQL的MasterSlave架构

    MySQL的Master-Slave架构是一种常见的数据库高可用性和负载均衡解决方案。它允许数据从一个主服务器(Master)实时同步到一个或多个从服务器(Slave)。在这种架构中,所有的写操作都在主服务器上执行,而从服务器则...

    mysql master/slave介绍及配置

    Master-Slave的数据库机构解决了很多问题,特别是read/write比较高的web2.0应用: 1、写操作全部在Master结点执行,并由Slave数据库结点定时(默认60s)读取Master的bin-log 2、将众多的用户读请求分散到更多的...

    Mysql-master-slave.rar_Master/Slave_slave mysql

    5. **启动复制**:在从服务器上,使用`START SLAVE`命令启动复制进程。此时,从服务器将开始读取主服务器的binlog并执行相应的SQL语句。 二、主从复制工作原理 1. **写操作**:在主服务器上,任何数据修改都会被...

    MySQL Master Slave构架 spring3 整合

    里面实现的是动态切换数据源,大家都是知道,spring2之后添加AbstractRoutingDataSource这个东西,这个就可以实现切换数据源,实现思路是:先按照搭建MySQL的MasterSlave架构.doc>>(我上传有资源),搭建好,然后动态...

    MySQL-Master_Slave_repl.txt

    Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs This error generally occur when we clone the master to slaver. Delete auto.cnf of mysql, and then ...

    mysql slave切换为master 测试

    mysql slave切换为master 测试

    CentOS7安装mysql5.7.19&mysql5;.7.19主从配置(CentOS7)

    - 使用主服务器的复制用户登录:`mysql -u replication_user -p -h master_server_ip` - 配置从服务器为复制奴隶:`CHANGE MASTER TO MASTER_HOST='master_server_ip', MASTER_USER='replication_user', MASTER_...

    ActiveMQ Master/Slave 主从配置

    ActiveMQ支持多种高可用的主从配置模式,包括Shared File System Master/Slave、JDBC Master/Slave和Replicated LevelDB Store。文章主要介绍了使用JDBC Master/Slave模式来实现ActiveMQ的高可用配置。 在JDBC ...

    mysql-master-master

    MySQL的主主复制(Master-Master Replication)是一种高可用性解决方案,它允许两个或多个数据库服务器互相复制数据,形成一个集群。在这种模式下,每个节点既是主节点,也是从节点,可以接受读写操作。当一个节点...

    mysql5.5 master-slave(Replication)配置方法

    ### MySQL 5.5 Master-Slave (Replication) 配置详解 #### 一、基础知识简介 在深入了解具体的配置步骤之前,我们首先简要回顾一下MySQL中的Master-Slave复制机制的基础概念。 - **主从复制(Master-Slave ...

    可用于监控 mysql Master Slave 状态的python代码

    MySQL的主从复制(Master-Slave Replication)是一种常用的数据冗余和负载均衡策略,它允许数据库系统在多个服务器之间同步数据。当一个MySQL服务器(主服务器,Master)接收到写操作时,这些更改会被记录到二进制...

    docker-mysql-master-slave-master.zip

    此资源为shardingsphere 调研...内容:一个master mysql docker实例,一个slave docker实例 内置3个库,mydb,mydb0,mydb1。仅开启了这三个库的主从。如果三个库主从不够用,自行配置。 使用:1.解压 2.执行build.sh

    MYSQL的masterslave数据同步配置.rar

    MySQL的主从(Master-Slave)数据同步配置是一种常见的数据库高可用性和负载均衡解决方案,它允许数据在多个服务器之间复制,确保数据的一致性,并且可以在主服务器故障时提供故障转移。以下是对这一主题的详细说明...

    基于MySQL数据库复制Master-Slave架构的分析

    MySQL数据库复制Master-Slave架构是一种常见的数据库高可用性和扩展性的解决方案。在这一架构中,数据库被分为一个主服务器(Master)和一个或多个从服务器(Slave)。主服务器接收并处理所有的写操作,如INSERT、...

    基于MySQL Master Slave同步配置的操作详解

    MySQL Master-Slave 同步配置是数据库高可用性架构中的常见实践,它允许数据从一个主节点(Master)实时复制到一个或多个从节点(Slave)。这种配置主要用于数据备份、负载均衡和故障恢复。以下是对MySQL Master-...

    joeywang310#mysql-master-slave#Mysql主从复制集群搭建-基于DockerCompose1

    如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致slave mysql容器配置配置Dockerfile设置server_id,一般设置为

    如何解决MySQL的master-slave模式中ReplicationDriver的使用问题

    在MySQL数据库系统中,主从复制(Master-Slave Replication)是一种常用的数据冗余和负载均衡策略。这种模式允许数据从一个主服务器(Master)实时同步到一个或多个从服务器(Slave)。当主服务器上的数据发生变化时...

Global site tag (gtag.js) - Google Analytics