Mysql存储引擎的选择
Mysql存储引擎概述
mysql的存储引擎是插件式的,用户可以根据需求选择如何存储和索引数据是否使用事务等.
Mysql支持多种存储引擎,用户可以选择不同的引擎来提高应用的效率,灵活的存储方案,存储的可定制型很强.
这里只要介绍常用的MyISAM和innoDB引擎.
当然还有其他很多引擎比如MEMORY/MERGE/EXAMPLE等等.
Mysql的默认引擎:
- Mysql5.5之前用的是MyISAM
- Mysql5.5以后用的是InnoDB
查看数据库支持的引擎:
mysql> show engines \G
*************************** 3. row ***************************
Engine: MyISAM
Support: YES
Comment: MyISAM storage engine
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: ARCHIVE
Support: YES
Comment: Archive storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 8. row ***************************
Engine: InnoDB
Support: DEFAULT
Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
XA: YES
Savepoints: YES
*************************** 9. row ***************************
Engine: PERFORMANCE_SCHEMA
Support: YES
Comment: Performance Schema
Transactions: NO
XA: NO
Savepoints: NO
9 rows in set (0.00 sec)
创建表时可以通过ENGINE关键字来设置表的引擎
CREATE TABLE ai(
i BIGINT(20) NOT NULL AUTO_INCREMENT,
PRIMARY KEY(i)) ENGINE=MyISAM
修改ai表的引擎为InnoDB
mysql> alter table ai engine = innodb;
查看表的创建信息:可以看到引擎已经被修改成InnoDB
mysql> show create table ai \G
*************************** 1. row ***************************
Table: ai
Create Table: CREATE TABLE `ai` (
`i` bigint(20) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`i`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
MyISAM
MyISAM基本介绍
MyISAM不支持事务,也不支持外键,但是他的优势是访问的速度快,对事务的完整性没有要求或者以select 和insert为主的基本上都可以选择该引擎来创建表.
每个MyISAM在磁盘上存储成3个文件,他的文件名都和表名相同,但扩展名分别是:
- .frm(存储表定义)
- .MYD(MYDdata,存储数据)
- .MYI(MYIindex,存储索引)
MyISAM的3钟存储格式
MyISAM的表支持3中不同的存储格式
- 静态表(固定长度)
- 动态表
- 压缩版
静态表
静态表是默认的存储格式.静态表中的字段都是不可变长字段,这样每个记录都是固定长度的.
这种存储方式的优点是
- 存储非常迅速
- 容易缓存
- 出现故障容易恢复
缺点:
- 占用的空间通常比较多
静态表在存储的时候会按照列的宽度定义补足空格,但是在访问的时候这些空格在返回给应用之前已经去掉.
注意
如果保存的内容后面有空格,那么在返回结果的时候也会被去掉,因为静态表是默认的存储格式
例子:
CREATE TABLE sam (name char(10)) ENGINE=myisam INSERT into sam VALUES('abcd'),('ab cd'),(' abcd'),('abcd ') mysql> select name,length(name) from sam;
+--------+--------------+
| name | length(name) |
+--------+--------------+
| abcd | 4 |
| ab cd | 6 |
| abcd | 6 |
| abcd | 4 |
+--------+--------------+
4 rows in set (0.06 sec)
动态表
动态表包含变长字段,记录不是固定长度的,这样的有点是占用空间相对较少频繁的更新和删除记录会产生碎片,并且在出现故障时,恢复相对比较难
压缩表
压缩表由myisampack创建,占据非常小的磁盘空间,因为每个记录是被单独压缩的,所有只有非常小的访问开支.
InnoDB
InnoDB介绍
innoDB存储引擎提供了具有提交,回滚和崩溃恢复能力的事务安全.但是对比MyIsam的存储引擎,InnoDB写的处理效率差一些,并且会占用更多的磁盘空间来保存数据和索引
自动增长列
InnoDB表的自动增长列可以手工插入,但是插入的值如果是0或者空,则实际插入的讲师自动增长后的值
mysql> CREATE TABLE auto_demo(
-> i int not null auto_increment,
-> name VARCHAR(10),PRIMARY KEY(i)
-> ); mysql> INSERT into auto_demo VALUES(1,''),(0,''),(null,''); mysql> select * from auto_demo;
+---+------+
| i | name |
+---+------+
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
+---+------+
对于InnoDB表,自动增长列必须是索引.
外键约束
Mysql支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引.
--- 每一个班主任会对应多个学生 , 而每个学生只能对应一个班主任 ----主表 CREATE TABLE ClassCharger( id TINYINT PRIMARY KEY auto_increment,
name VARCHAR (20),
age INT ,
is_marriged boolean -- show create table ClassCharger: tinyint(1) ); INSERT INTO ClassCharger (name,age,is_marriged) VALUES ("冰冰",12,0),
("丹丹",14,0),
("歪歪",22,0),
("姗姗",20,0),
("小雨",21,0); ----子表 CREATE TABLE Student( id INT PRIMARY KEY auto_increment,
name VARCHAR (20),
charger_id TINYINT, --切记:作为外键一定要和关联主键的数据类型保持一致
-- [ADD CONSTRAINT charger_fk_stu]FOREIGN KEY (charger_id) REFERENCES ClassCharger(id) ) ENGINE=INNODB; INSERT INTO Student(name,charger_id) VALUES ("alvin1",2),
("alvin2",4),
("alvin3",1),
("alvin4",3),
("alvin5",1),
("alvin6",3),
("alvin7",2); DELETE FROM ClassCharger WHERE name="冰冰";
INSERT student (name,charger_id) VALUES ("yuan",1);
-- 删除居然成功,可是 alvin3显示还是有班主任id=1的冰冰的; -----------增加外键和删除外键--------- ALTER TABLE student ADD CONSTRAINT abc
FOREIGN KEY(charger_id)
REFERENCES classcharger(id) on DELETE RESTRICT ON UPDATE CASCADE; ALTER TABLE student DROP FOREIGN KEY abc;
介绍在创建索引时,可以指定在删除更新父表时,对子表进行的相应操作的几种方式
- RESTRICT和NO ACTION
- RESTRICT和NO ACTION是相同的,是指限制在子表有关联记录得到情况下父表不能更新
- CASCADE
- 父表在更新或者删除时,更新或者删除子表对应记录
- SET NULL
- 表示父表在更新或者删除的时候,子表对应的字段被设置成 SET NULL.
在创建表的时候外键指定是
ON DELETE RESTRICT ON UPDATE CASCADE
表在删除的时候有RESTRICT 的性质,在更新的时候有CASCADE的性质.
存储方式
InnoDB的存储表和索引有两种方式
- 使用共享表空间存储
- 这种方式创建的表的表结构保存在.frm文件中,数据和索引保存在innodb_data_home_dir和innodb_data_file_path定义的表空间中.
- 使用多表空间存储
- 这种方式创建的表的表结构保存在.frm文件中,但是每个表的数据和索引都单独保存在.ibd中,如果是分区表,则每个分区对应单独的.ibd文件,文件名是"表名+分区名"
如何选择合适的引擎
- MyIsam
- 如果应用是以度操作和插入操作为主的,只有很少的更新和删除操作,并且对事务的完整性,并发性要求不高的,那么选择MyIsam
- Innodb
- 用于事务处理应用程序,支持外键,如果对事务的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了查询以外,包含很多的更新.删除操作,那么Innodb存储引擎是比较合适的选择
当然还有Innodb支持行锁和表锁,
myisam支持表锁不再介绍.
转载需要标明出处!
Mysql存储引擎的选择的更多相关文章
- Mysql存储引擎及选择方法
0x00 Mysql数据库常用存储引擎 Mysql数据库是一款开源的数据库,支持多种存储引擎的选择,比如目前最常用的存储引擎有:MyISAM,InnoDB,Memory等. MyISAM存储引擎 My ...
- mysql 存储引擎的选择
MyISAM:如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性.并发性要求不是很高,选择这个存储引擎非常合适.MyISAM在Web.数据仓储和其他应用环境下最常使用的存储 ...
- InnoDB还是MyISAM 再谈MySQL存储引擎的选择
两种类型最主要的差别就是Innodb 支持事务处理与外键和行级锁.而MyISAM不支持.所以MyISAM往往就容易被人认为只适合在小项目中使用. 我作为使用MySQL的用户角度出发,Innodb和My ...
- mysql 存储引擎的选择你会吗?
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXExMzU1NTQxNDQ4/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...
- mysql 存储引擎 InnoDB 与 MyISAM 的区别和选择
http://www.blogjava.net/jiangshachina/archive/2009/05/31/279288.html 酷壳 - MySQL: InnoDB 还是 MyISA ...
- MYSQL系列-Mysql存储引擎选择
MYSQL系列-Mysql存储引擎选择 //查看当前数据库支持的存储引擎 show engines \G; 创建表的时候可以通过engine=MyISAM指定存储引擎 MyISAM: .MYISAM不 ...
- MySQL开发篇,存储引擎的选择真的很重要吗?
前言 谁说MySQL查询千万级别的数据很拉跨?我今天就要好好的和你拉拉家常,畅谈到深夜,一起过除夕!这篇文章也是年前的最后一篇,希望能带给大家些许收获,不知不觉查找文档和参考实体书籍就写了这么多,自己 ...
- Mysql存储引擎比较
Mysql作为一个开源的免费数据库,在平时项目当中会经常使用到,而在项目当中我们的着重点一般在设计使用数据库上而非mysql本身上,所以在提到mysql的存储引擎时,一般都不曾知道,这里经过网上相关文 ...
- MySQL存储引擎之Myisam和Innodb总结性梳理
Mysql有两种存储引擎:InnoDB与Myisam,下表是两种引擎的简单对比 MyISAM InnoDB 构成上的区别: 每个MyISAM在磁盘上存储成三个文件.第一个 文件的名字以表的名字开始 ...
随机推荐
- mongoDB GUI客户端工具大全
网易blog - MongoDB GUI客户端工具大全 oschina - MonjaDB 1.0.2 发布,MongoDB 的 GUI 客户端 oschina创建人红薯对MonjaDB官方文 ...
- MvcPager帮助文档 - MvcAjaxOptions 类
表示用于 MvcPager 在 Ajax 分页模式下的选项设置,该类继承自 AjaxOptions. 公共属性: 名称 说明 默认值 AllowCache 获取或设置一个值,该值指示是否在Ajax分页 ...
- win10 rabbitMQ的安装与测试
安装 1.首先,下载并运行Erlang for Windows 安装程序 (地址:http://www.erlang.org/downloads)下载完毕并安装(注意:安装目录请选择默认目录) 2.下 ...
- android推送方式
本文介绍在Android中实现推送方式的基础知识及相关解决方案.推送功能在手机开发中应用的场景是越来起来了,不说别的,就我们手机上的新闻客户端就时不j时的推送过来新的消息,很方便的阅读最新的新闻信息. ...
- Windows下MySQL備份與還原
方法一 備份: C:\...\MySQL\MySQL Server 5.1\bin\>mysqldump aa -u root -p > d:\aaa.sql.bak 還原: C:\... ...
- Atitit OOCSS vs bem
Atitit OOCSS vs bem 1. 今天最流行的CSS开发框架技术当属OOCSS,尽管还有其他类似的技术存在,如BEM.1 2. CSS设计模式:OOCSS 和 SMACSS1 2 ...
- VS2017 - Winform 简单托盘小程序
界面比较简单,主要两个button 一个NotifyIcon 和 右键菜单 控件, NotifyIcon 属性,如下: 并为NotifyIcon指定了DoubleClick事件: 主窗体增加两个事件: ...
- UI-2-UILabel&UIImageView-补充
课程要点: 控件之间的继承关系. UILabel UIImageView 利用UIImageView实现帧动画 补充 试图之间的继承关系 昨天学习UIView的时候,了解到UIView里面有以下几个常 ...
- 读写文件,用代码在讲html文件转为jsp文件
package my.testguava; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputSt ...
- GoWeb编程之HelloWorld
使用Go实现我们的第一个Web服务器程序 package main import "net/http" import "fmt" //打印HelloWorld ...