您的位置:首页 > 数据库 > MySQL

​MySQL学习——存储引擎

2013-06-28 15:30 295 查看
MySQL学习——存储引擎

mysql在5.5之后的默认存储引擎使用InnoDB,显示mysql版本:

mysql> select version();
+-----------+
| version() |
+-----------+
| 5.6.12    |
+-----------+
1 row in set (0.03 sec)


查看支持的存储引擎和当前默认的存储引擎:
mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| 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         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+


显示某一表使用的存储引擎:

mysql> use mysql
Database changed
mysql> show table status like 'user'\G
*************************** 1. row ***************************
Name: user
Engine: MyISAM
Version: 10
Row_format: Dynamic
Rows: 6
Avg_row_length: 52
Data_length: 312
Max_data_length: 281474976710655
Index_length: 2048
Data_free: 0
Auto_increment: NULL
Create_time: 2013-06-23 04:40:03
Update_time: 2013-06-23 04:40:04
Check_time: NULL
Collation: utf8_bin
Checksum: NULL
Create_options:
Comment: Users and global privileges
1 row in set (0.00 sec)
其中各个参数的介绍如下:

Name表名
Engine:表的存储引擎。
Row_format:行格式,myisam可以使用的行格式有Dynamic、Fixed、Compressed。Dynamic表示长度可变。
Rows表中的行数
Avg_row_length:平均每行的字节数。
Data_length:整个表的字节数。
Max_data_length:可容纳的最大数据量。
Data_free:已经分配但未使用的空间。
Auto_increment:下一个auto_increment的值。
Create_time:表最初创建的时间。
Update_time:表数据最近被更新的时间。
Check_time:最近被检查的时间。
Collation:默认字符集好排序规则。
Checksum:如果启用,会计算整个表的实时校验和。
Create_options:表创建时的其它所有选项。
Comment:其它说明。


如果要改变默认存储引擎:修改my.cnf
default_storage_engine = ...

MyISAM存储引擎:

对于MyISAM存储引擎,每一个表都有三个文件:
data数据文件,扩展名为.MYD
indexes索引文件,扩展名为.MYI
definition表定义,扩展名为.frm

MyISAM格式是平台通用的,可以在不同架构的服务器上相互拷贝数据文件。MyISAM表可以容纳的行数,一般只受限于数据库服务器的可用从盘空间大小,以及操作系统允许创建的最大文件大小。

MyISAM的特征:
锁:
支持表级锁,但不支持行级锁。读锁在整个表上为共享锁,而写锁为排他锁。用户在运行select时,可以在同一表中并发插入新行。

索引:

支持全文索引。当使用DELAY_KEY_WRITE创建表时,不会立即将改变的索引写入磁盘,而是先写入内存的键缓冲区,在清理缓冲区会关闭表时,在写进磁盘。对于复杂的表,延迟更新索引大大提高了性能。不支持hash索引;支持BTREE、FULLTEXT、RTREE索引。

非事务,不支持外键,支持数据压缩。

InnoDB存储引擎:
对于InnoDB存储引擎,所有的表都只有一个字段:

tablespace 表空间,在表空间中,InnoDB自我管理数据。InnoDB也支持将每个表和索引存储为单独的分离文件。

InnoDB存储引擎是专为事务设计的一款存储引擎。
先介绍一下事务:
事务:一组需要同时执行或不执行的sql语句。事务有4大特性,简称ACID:
1: 原子性 ,要么执行,要么不执行。
2: 一致性,时务执行后,状态完全装换为执行后的状态。
3:隔离性,一个事务在执行过程中产生的数据,其他事务是否能够看到。InnoDB支持4个标准的隔离级别
1.读未提交READ UNCOMMITTED : 可以读别人未提交的(数据)事务
2.读提交READ COMMITTED : 别人未commit时,看到的是原数据,别人提交后,即可看到别人改变后的数据。
3.可重读REPEATABLE READ : 自己所看到的状态是不变的,直到自己提交 (commit)repeatable ,才能看到别人更改的数据,这是InnoDB的默认隔离级别。
4.串行化 SERIALIZABLE:完全隔离级别。别人的事务不提交,自己就处于waiting状态,直到别人提交事务。
显示隔离级别:>SHOW GLOBAL VARIABLES LIKE 'tx_isolation'; 也可以 >SELECT @@tx_isolation;
设定隔离级别:(global全局对所有数据库都生效。session会话只对本会话生效。global后需要重新登入数据库。
全局:SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
4:持久性,事务提交会永久存储。

事务的使用方法:
启动事务:>START TRANSACTION;
...

>ROLLBACK //回滚到事务执行前的状态
>SAVE POINT sp_name //保存点
>ROLLBACK sp_name //只回滚到某个保存点
>COMMIT //提交事务

InnoDB引擎特定:
1.支持事务
2.支持行级别的锁
3.支持外键
4.支持自适应的hash索引,支持聚簇、BTREE索引
5.支持可配置的索引缓存和数据缓存大小
6.支持商业工具的在线备份
7.不指定使用事务时,语句执行完成后,服务器隐式自动提交

MyISAM Merge引擎:
Merge引擎是MyISAM的变种,合并表是指将几个相同的MyISAM表合并为一个虚表,对于记录日志和数据仓库的应用很有用。

Memory引擎:
Memory引擎将所有数据存储在内存中,适合于那些需要快速访问数据,且系统重启后数据不需要保存。Memory引擎的查询不需要等待I/O处理,速度非常块。Memory引擎不支持事务,支持表级锁,只支持固定大小的行,比如将VARCHAR类型存储为CHAR,从而节约内存。

NDB Cluster引擎:
NDB Cluster引擎可以满足一些高速性能需求,同时支持冗余和负载均衡特性。它在磁盘上记录日志,但数据保存在内存中。一个NDB数据库有数据节点(data node),管理节点(management node)和sql节点(mysql 实例)组成。么个节点都保存了集群数据中的一段数据。这写片段都是复制未来的,因此在不同的节点上,系统会拥有同一数据的多分拷贝,一台物理服务器通常只专用于一个节点。这种功能类似于服务器级的RAID。

Maria引擎:
Maria引擎设计的目的是为了是为了取代MyISAM,其特点是:可以基于每张表的事务性和非事务性存储;即使运行在非事务性模式下,也能进行崩溃后恢复;支持行级锁;具有更好的blob数据处理功能。

如何选择存储引擎:
选择存储引擎要从多方面考虑:如果需要事务处理操作,那么InnoDB是一个很好的选择;如果不需要事务操作,主要是多读少写时,那么MyISAM是一个比较好的选择。如果只是需要并发的插入操作和读操作,那么MyISAM是一个很好的选择。从备份的角度考虑:如果服务器可以周期性的停机进行备份,那么各种引擎都可满足需求;否则需要根据具体的备份条件进行选择。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mysql 存储引擎