Mysql存储引擎概念特点介绍及不同业务场景选用依据
目录
MySQL引擎概述
Mysql表存储结构是Mysql数据库的重要组成部分,下面就大家介绍3种主要mysql表存储结构MyISAM,InnoDB和NDBCluster。实际上,MySQL不仅可以同时使用多种存储引擎,而且每种存储引擎和MySQL之间通过插件的方式使用。下面是MySQL存储引擎体系结构简图:
1 MySAM引擎介绍
1.1 什么是MyISAM引擎?
MyISAM是MySQL关系数据库管理系统的默认存储引擎(mysql5.5以前)。这种MySQL表存储结构从旧ISAM代码扩展出许多有用的功能。在新版本的MySQL中,InnoDB引擎由于其对事务参照完整性,以及更高的并发性等优点开始逐步的取代MyISAM。
查看数据库的存储引擎:
mysql5.5
mysql-master>select version();
+------------+
| version() |
+------------+
| 5.5.32-log |
+------------+
1 row in set (0.03 sec)
mysql-master>show engines\G
*************************** 1. row ***************************
Engine: MyISAM
Support: YES
Comment: MyISAM storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 2. row ***************************
Engine: FEDERATED
Support: NO
Comment: Federated MySQL storage engine
Transactions: NULL
XA: NULL
Savepoints: NULL
*************************** 3. row ***************************
Engine: MRG_MYISAM
Support: YES
Comment: Collection of identical MyISAM tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 4. row ***************************
Engine: BLACKHOLE
Support: YES
Comment: /dev/null storage engine (anything you write to it disappears)
Transactions: NO
XA: NO
Savepoints: NO
*************************** 5. row ***************************
Engine: CSV
Support: YES
Comment: CSV storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 6. row ***************************
Engine: MEMORY
Support: YES
Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 7. row ***************************
Engine: InnoDB
Support: DEFAULT
Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
XA: YES
Savepoints: YES
*************************** 8. row ***************************
Engine: PERFORMANCE_SCHEMA
Support: YES
Comment: Performance Schema
Transactions: NO
XA: NO
Savepoints: NO
8 rows in set (0.02 sec)
MYSQL5.1
mysql-master>select version();
+-----------+
| version() |
+-----------+
| 5.1.72 |
+-----------+
1 row in set (0.00 sec)
mysql-5.1>show engines\G
*************************** 1. row ***************************
Engine: MRG_MYISAM
Support: YES
Comment: Collection of identical MyISAM tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 2. row ***************************
Engine: CSV
Support: YES
Comment: CSV storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 3. row ***************************
Engine: MyISAM
Support: DEFAULT
Comment: Default engine as of MySQL 3.23 with great performance
Transactions: NO
XA: NO
Savepoints: NO
*************************** 4. row ***************************
Engine: InnoDB
Support: YES
Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
XA: YES
Savepoints: YES
*************************** 5. row ***************************
Engine: MEMORY
Support: YES
Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
XA: NO
Savepoints: NO
5 rows in set (0.09 sec)
范例:
mysql-5.1>create database oldboy;
Query OK, 1 row affected (0.00 sec)
mysql-5.1>use oldboy;
Database changed
mysql-5.1>create table test1(id int);
Query OK, 0 rows affected (0.08 sec)
mysql-5.1>show create table test1\G
*************************** 1. row ***************************
Table: test1
Create Table: CREATE TABLE `test1` (
`id` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
1 row in set (0.01 sec)
范例:
[root@php ~]# ll /application/mysql/data/oldboy/
total 20
-rw-rw---- 1 mysql mysql65 Mar 29 20:23 db.opt
-rw-rw---- 1 mysql mysql0 Mar 29 20:23 test1.MYD
-rw-rw---- 1 mysql mysql 1024 Mar 29 20:23 test1.MYI
-rw-rw---- 1 mysql mysql 8556 Mar 29 20:23 test1.frm
1.2 MyISAM引擎特点
1)※不支持事务。
2)表级锁定(更新时锁定整个表):其锁定机制是表级索引,这虽然可以让锁定的实现成本很小但是也同时大大降低了其并发性能。
3)读写互相阻塞:不仅会在写入的时候阻塞读取,MYISAM还会在读取的时候阻塞写入,但读本身并不会阻塞另外的读。
4)只会缓存索引:MYISAM可以通过key_buffer缓存以大大提高访问性能减少磁盘IO,但是这个缓存区只会缓存索引,而不会缓存数据。
[root@mysql 3307]# grep key_buffer my.cnf
key_buffer_size = 16M
5)读取速度较快。占用资源相对少。
6)不支持外键约束,但支持全文索引。
7)MYISAM引擎是MYSQL缺省的存储引擎。
什么是事务?
事务(基于 innodb 引擎的数据库,对于 myisam 引擎数据库就不支持事务)
1、事务是指逻辑上的一组操作,组成这组操作的各个单元,要么全成功要么全失败。
例如:A-B 转账,对应的如下 sql 语句
update from account set money=money-100 where name='a';
update from account set money=money+100 where name='b';
数据库默认事务是自动提交的, 也就是发一条 sql 它就执行一条。如果想多条 sql 放在一个事务中执行,则需要使用事务进行处理。当我们开启一个事务,并且没有提交,mysql 会自动回滚事务。或者我们使用 rollback 命令手动回滚事务。
事务:
一、事务介绍
通俗的说事务: 指一组SQL操作, 事务中的操作要么都发生,要么都不发生。à原子性(Atomicity)
在所有的操作没有执行完毕之前,其他会话不能够看到中间改变的过程 à隔离性(Isolation)
事务发生前和发生后,数据的完整性必须保持一致。à一致性(Consistency)
一个事务一旦被提交,它对数据库中的数据改变就是永久性的。à持久性(Durability)
如果出了错误,事务也不允许撤消, 只能通过"补偿性事务"
二、事务例子
事务例子:转账
A: ---->支出100, A -100
B: ---->收到100, B +100
A-B 转账,对应的如下 sql 语句
update from account set money=money-100 where name='a';
update from account set money=money+100 where name='b';
MySQL5.5支持事务的引擎: innodb/ndb
Make && make install
三、事务的四大特性(ACID)
1、原子性(Atomicity)
事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
2、一致性(Consistency)
事务前后数据的完整性必须保持一致。
3、隔离性(Isolation)
多个用户并发访问数据库时,一个用户的事务不能被其它用户的事物所干扰,多个并发事务之间的数据要相互隔离。
4、持久性(Durability)
一个事务一旦被提交,它对数据库中的数据改变就是永久性的。
四、事务的开启:
数据库开启事务命令:
start transcation 开启事务
rollback 回滚事务
commit 提交事务
1.3 MyISAM引擎适用的生产业务场景
1、不需要事务支持的业务,一般为读数据比较多的网站应用。
2、并发相对较低的业务(纯读纯写高并发也可以)(锁定机制问题)。
3、数据修改相对较少的业务(阻塞问题)。
4、以读为主的业务,例如:www,blog,图片信息数据库,用户数据库,商品数据库等业务。
5、对数据一致性要求不是非常高的业务。
6、中小型的网站部分业务会用。
小结:单一对数据库的操作都可以使用MyISAM,所谓单一就是尽量纯读,或纯写(insert,update,delete)等。
生产建议:没有特别需求,一律用innodb。
1.4 MyISAM引擎调优精要
1、尽量索引(缓存机制)。
2、调整读写优先级,根据实际需要确保重要操作更优先。
3、启用延迟插入改善大批量写入性能。(降低写入频率,尽可能多条数据一次性写入)
4、尽量顺序操作让insert数据都写入到尾部,减少阻塞。
5、分解大的操作,降低单个操作的阻塞时间。
6、降低并发数,某些高并发场景通过应用进行排队机制。
7、对于相对静态的数据,充分利用Query Cache或memcached可以极大的提高访问效率。
[root@mysql 3307]# grep query my.cnf
query_cache_size = 2M
query_cache_limit = 1M
query_cache_min_res_unit = 2k
这几个参数都是mysql自身缓存设置。
8、MYISAM的count只有在全表扫描的时候特别高效,带有其他条件的count都需要进行实际的数据访问。
mysql-5.5> select count(* ) from zizeng;
+-----------+
| count(* ) |
+-----------+
| 10 |
+-----------+
1 row in set (0.06 sec)
9、把主从同步的主库用innodb,从库使用myisam引擎。
2 什么是InnoDB引擎?
InnoDB引擎是MySQL的另一个存储引擎,正成为目前mysql AB所发行新版的标准,被包含在所有二进制安装包里。较之于其他的存储引擎,它的优点是支持兼容ACID的事务(类似于postgresql)以及参数完整性(即对外键的支持)。Oracle公司于2005年10月份收购了Innobase。innobase采用双认证授权。他使用GNU发行,也允许其他想将InnoDB结合到商业软件的团体获得授权。
2.1 InnoDB引擎特点
1、支持事务:支持4个事务隔离级别,支持多版本读。
2、行级锁定(更新时一般是锁定当前行):通过索引实现,全表扫描仍然会是表锁,注意间隙锁的影响。
3、读写阻塞与事务隔离级别相关。
4、具有非常高效的缓存特性:能缓存索引,也能缓存数据。
5、整个表和主键以Cluster方式存储,组成一颗平衡树。
6、所有Secondary index都会保存主键信息。
7、支持分区,表空间,类似oracle数据库。
8、支持外键约束,不支持全文索引。
2.2 InnoDB引擎适用的生产业务场景
1、需要事务支持(具有较好的事务特性)
2、行级锁定对高并发有很好的适应能力,但需要确保查询是通过索引完成。
3、数据更新较为频繁的场景,如:bbs,sns等。
4、数据一致性要求较高的业务。例如:充值,银行转账。
5、硬件设备内存较大,可以利用InnoDB较好的缓存能力来提高内存利用率,尽可能减少磁盘IO。
[root@mysql 3307]# grep -i innodb my.cnf
#default_table_type = InnoDB
innodb_additional_mem_pool_size = 4M
innodb_buffer_pool_size = 32M
innodb_data_file_path = ibdata1:128M:autoextend
innodb_file_io_threads = 4
innodb_thread_concurrency = 8
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 2M
innodb_log_file_size = 4M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120
innodb_file_per_table = 0
物理数据文件:
[root@mysql 3307]# ll data/ibdata1
-rw-rw---- 1 mysql mysql 134217728 May 15 08:31 data/ibdata1
6、相比Myisam引擎,innodb引擎更消耗资源,速度没有myisam引擎快。
2.3 InnoDB引擎调优精要
1、主键尽可能小,避免给Secondary index带来过大的空间负担。
2、避免全表扫描,因为会使用表锁。
3、尽可能缓存所有的索引和数据,提高响应速度,减少磁盘IO消耗。
4、在大量小插入的时候,尽量自己控制事务而不要使用autocommit自动提交。有开关可以控制提交方式;
5、合理设置innodb_flush_log_at_trx_commit参数值,不要过度追求安全性。
6、避免主键更新,因为这会带来大量的数据移动。
引擎修改
alter table test1 ENGINE = INNODB;
mysql-5.1>use oldboy
Database changed
mysql-5.1>show create table test1\G
*************************** 1. row ***************************
Table: test1
Create Table: CREATE TABLE `test1` (
`id` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
1 row in set (0.01 sec)
mysql-5.1>alter table test1 ENGINE = INNODB;
Query OK, 0 rows affected (0.49 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql-5.1>show create table test1\G
*************************** 1. row ***************************
Table: test1
Create Table: CREATE TABLE `test1` (
`id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.04 sec)
3 生产环境中如何批量更改MySQL引擎
法1)mysql命令语句修改:
alter table test1 ENGINE = INNODB;
更改引擎实例
mysql-5.1>alter table test1 ENGINE = INNODB;
Query OK, 0 rows affected (0.49 sec)
Records: 0 Duplicates: 0 Warnings: 0
查看修改后的结果
mysql-5.1>show create table test1\G
*************************** 1. row ***************************
Table: test1
Create Table: CREATE TABLE `test1` (
`id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.04 sec)
特别提示:更改Mysql引擎后也需要相关参数的支持,否则,效果可能不佳。
如果批量修改可以通过脚本循环上面的命令。
法2)使用sed对备份内容进行引擎转换
nohup sed –e ‘s/MyISAM/InnoDB/g’ oldboy.sql >oldboy_1.sql &
法3)mysql_convert_table_format 命令修改
#!/bin/sh
# Created by oldboy.
# To convert a table engine.
cd /usr/local/mysql/bin
echo 'Enter Host Name:'
read HOSTNAME
echo 'Enter User Name:'
read USERNAME
echo 'Enter Password:'
read PASSWD
echo 'Enter Socket Path:'
read SOCKETPATH
echo 'Enter Database Name:'
read DBNAME
echo 'Enter Table Name:'
read TBNAME
echo 'Enter Table Engine:'
read TBTYPE
./mysql_convert_table_format --host=$HOSTNAME --user=$USERNAME --password=$PASSWD --socket=$SOCKETPATH --type=$TBTYPE $DBNAME $TBNAME
特别说明:
我们做了引擎的修改,my.cnf的参数配置也一定要跟上。
4 有关MySQL引擎常见企业面试题
1、MySQL有哪些存储引擎,各自有什么区别?
MyISAM、InnoDB、MEMORY
2、生产环境中应如何选用MySQL的引擎?
一般在既有读又有写的业务中,建议使用innodb引擎,一句话尽可能多的使用innodb引擎。
mysql-5.1>show engines;
+------------+---------+------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment| Transactions | XA | Savepoints |
+------------+---------+------------------------------------------------------------+--------------+------+------------+
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO|
| CSV | YES | CSV storage engine | NO | NO | NO|
| MyISAM | DEFAULT | Default engine as of MySQL 3.23 with great performance | NO | NO | NO |
| InnoDB | YES | Supports transactions, row-level locking, and foreign keys | YES| YES | YES |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO|
+------------+---------+------------------------------------------------------------+--------------+------+------------+
5 rows in set (0.00 sec)
mysql-5.5> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment| Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| MyISAM | YES | MyISAM storage engine | NO | NO | NO|
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO|
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO|
| CSV | YES | CSV storage engine | NO | NO | NO|
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO|
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES| YES |
| PERFORMANCE_SCHEMA | YES| Performance Schema | NO | NO | NO|
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
8 rows in set (0.01 sec)
Mysql存储引擎概念特点介绍及不同业务场景选用依据的更多相关文章
- 为什么用B+树做索引&MySQL存储引擎简介
索引的数据结构 为什么不是二叉树,红黑树什么的呢? 首先,一般来说,索引本身也很大,不可能全部存在内存中,因此索引往往以索引文件的方式存在磁盘上.然后一般一个结点一个磁盘块,也就是读一个结点要进行一次 ...
- {MySQL存储引擎介绍}一 存储引擎解释 二 MySQL存储引擎分类 三 不同存储引擎的使用
MySQL存储引擎介绍 MySQL之存储引擎 本节目录 一 存储引擎解释 二 MySQL存储引擎分类 三 不同存储引擎的使用 一 存储引擎解释 首先确定一点,存储引擎的概念是MySQL里面才有的,不是 ...
- mysql 存储引擎介绍
一 存储引擎解释 首先确定一点,存储引擎的概念是MySQL里面才有的,不是所有的关系型数据库都有存储引擎这个概念,后面我们还会说,但是现在要确定这一点. 在讲清楚什么是存储引擎之前,我们先来个比喻, ...
- MySQL高级学习笔记(三):Mysql逻辑架构介绍、mysql存储引擎
文章目录 Mysql逻辑架构介绍 总体概览 总体概览 mysql存储引擎 查看命令 看你的 mysql 现在已提供什么存储引擎 : 看你的 mysql 当前默认的存储引擎 : 各个引擎简介 MyISA ...
- [MySQL数据库之表的详细操作:存储引擎、表介绍、表字段之数据类型]
[MySQL数据库之表的详细操作:存储引擎.表介绍.表字段之数据类型] 表的详细操作 存储引擎 mysql中建立的库======>文件夹 库中建立的表======>文件 用来存储数据的文件 ...
- 数据库 --> MySQL存储引擎介绍
MySQL存储引擎介绍 MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的顺序访问方法)所改良.虽然 ...
- MYSQL存储引擎介绍--应用场景
MySQL存储引擎通常有哪3种?各自分别有什么特点?应用场景是哪些? MySQL5.5以后默认使用InnoDB存储引擎,其中InnoDB和BDB提供事务安全表,其它存储引擎都是非事务安全表.若要修改默 ...
- 第 3 章 MySQL 存储引擎简介
第 3 章 MySQL 存储引擎简介 前言 3.1 MySQL 存储引擎概述 MyISAM 存储引擎是 MySQL 默认的存储引擎,也是目前 MySQL 使用最为广泛的存储引擎之一.他的前身就是我们在 ...
- 【mysql】mysql存储引擎
了解存储引擎我们先看下mysql的体系架构. 上图是mysql的逻辑架构图,可以看到分了几层. 第一层是大部分网路客户端工具,比如php,python ,JDBC等,主要功能就是连接处理,授权认证等 ...
随机推荐
- 【转】 LINQ To SQL 语法及实例大全
LINQ to SQL语句(1)之Where Where操作 适用场景:实现过滤,查询等功能. 说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断条件就是它后面所接的子 ...
- CSS Hack是什么意思
CSS hack由于不同的浏览器,比如Internet Explorer 6,Internet Explorer 7,Mozilla Firefox等,对CSS的解析认识不一样,因此会导致生成的页面效 ...
- 安装Node.js
1.window下安装Node.js 安装git,方便使用命令行. 网址:http://www.git-scm.com/download/ 下载后直接安装即可 接着安装Node.js https:// ...
- Visual Studio 2015开发Android App问题集锦
Visual Studio 2015开发Android App 启动调试始终无法完成应用部署的解决方案 创建一个Android App项目后,直接启动调试发现Visual Studio Emulato ...
- [c#]asp.net开发微信公众平台(5)微信图文消息
上篇已经成功响应了关注事件,也实现了文本消息的发送,这篇开始图文消息处理, 微信中最常用的消息类型就是图文消息了,因为它图文并茂,最能表达信息. 图文消息在微信中的接口定义如下: <xml> ...
- OC基础 代理和协议
OC基础 代理和协议 1.协议 (1)oc语言中得协议:一组方法列表,不需要我们自己实现,由遵守协议的类来实现协议所定制的方法. (2)协议的使用步骤:制定协议-->遵守协议-->实现协议 ...
- MVC上传相关
1.上传大小设置 system.web节点,httpruntime节点加入maxRequestLength="4096",以K为单位,例子中大小限制为4M. 2.form提交htm ...
- 解决JavaScript中如何输出空格
在写JS代码的时候,大家可以会发现这样现象:document.write(" 1 2 3 ");结果: 1 2 3无论在输出的内容中什 ...
- JS模拟键盘事件 -- 原理及小例子
提问: 键盘默认事件,比如tab切换,alt+f4关闭,ctrl+t新建等,如果不想通过键盘而是一些按钮点击来触发这些功能,该咋办呢? 例子: 先以tab为例上一个小例子: <!DOCTYPE ...
- javascript闭包作用
闭包的简单概念:闭包就是能够读取其他函数内部变量的函数. 函数内部的函数闭包的两个最大的作用读取函数内部的变量变量的值始终保持在内存中function A(){ var n=999; nAdd=fun ...