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)