day07_mysql常用的引擎
mysql引擎
1、myisam ---不支持事务
2、innodb ---支持事务
-------------------------------------------
窗口1
create database myisam;
show databases;
use myisam;
窗口2
cd /app/mysql/data/myisam
ls 【db.opt 数据库的配置项,此文件可有可无】
窗口1
create table a1(a int) engine=myisam;
窗口2
cd /app/mysql/data/myisam
ls -lh
-rw-rw---- 1 mysql mysql 8.4K Apr 24 16:55 a1.frm
-rw-rw---- 1 mysql mysql 0 Apr 24 16:55 a1.MYD
-rw-rw---- 1 mysql mysql 1.0K Apr 24 16:55 a1.MYI
-rw-rw---- 1 mysql mysql 61 Apr 24 16:51 db.opt
seq 1 100 ------------产生1到100的数列,产生的文件必须放在tmp下
seq 1 10000000 >/tmp/bigfile
ls -lh /tmp/bigfile
窗口1
mysql> load data infile '/tmp/bigfile' into table a1; --------【把电脑中数据导入表,导入数据比较快,相对innodb引擎】
Query OK, 10000000 rows affected (3.78 sec)
窗口2
cd /app/mysql/data/myisam
ls -lh
-rw-rw---- 1 mysql mysql 8.4K Apr 24 17:02 a1.frm
-rw-rw---- 1 mysql mysql 67M Apr 24 17:03 a1.MYD
-rw-rw---- 1 mysql mysql 1.0K Apr 24 17:03 a1.MYI
-rw-rw---- 1 mysql mysql 61 Apr 24 16:51 db.opt
以myisam引擎创建表时,出现以下3个文件
.frm ---------存放表的结构
.MYD ---------存放数据
.MYI ---------存放索引
窗口1
select * from a1 where a=1000;
+------+
| a |
+------+
| 1000 |
+------+
1 row in set (1.31 sec)
alter table a1 add key 索引名 (a);【创建索引快,相对innodb引擎】 用看书说说索引
Query OK, 10000000 rows affected (21.55 sec)
select * from a1 where a=1000;
1 row in set (0.08 sec)
【alter table a1 drop key 索引名; 删除索引】
窗口2
cd /app/mysql/data/myisam
ls -lh
-rw-rw---- 1 mysql mysql 8.4K Apr 24 17:05 a1.frm
-rw-rw---- 1 mysql mysql 67M Apr 24 17:05 a1.MYD
-rw-rw---- 1 mysql mysql 108M Apr 24 17:05 a1.MYI
-rw-rw---- 1 mysql mysql 61 Apr 24 16:51 db.opt
窗口1
show create table a1;【显示创建a1表详细定义信息】
show create table a1;
+-------+--------------------------------
| Table | Create Table
+-------+--------------------------------
| a1 | CREATE TABLE `a1` (
`a` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
+-------+--------------------------------
-------------------------------------------------------
窗口1
create database innodb;
show databases;
use innodb;
create table a1(a int) engine=innodb;
窗口2
cd /app/mysql/data/innodb
ls -lh
-rw-rw---- 1 mysql mysql 8.4K Apr 24 17:15 a1.frm
-rw-rw---- 1 mysql mysql 96K Apr 24 17:15 a1.ibd
-rw-rw---- 1 mysql mysql 61 Apr 24 17:15 db.opt
/app/mysql/data/innodb/.frm 存放表的结构
/app/mysql/data/ibdata1 系统表空间文件,存储InnoDB系统相关信息,所有InnoDB表共用
/app/mysql/data/ibdata2
/app/mysql/data/innodb/.ibd文件:单表表空间文件,每个表使用一个表空间文件(file per table),存放用户数据库表数据和索引
/app/mysql/data/ib_logfile0和ib_logfile1 事务日志文件
ls -lh /app/mysql/data/ibdata1
窗口1
load data infile '/tmp/bigfile' into table a1; 【把电脑中数据导入表,导入数据比较慢,相对myisam引擎】
Query OK, 10000000 rows affected (1 min 24.07 sec)
alter table a1 add key 索引名 (a); 【创建索引慢,相对myisam引擎】
Query OK, 0 rows affected (1 min 14.10 sec)
------------------------------------------------------------------------
myisam引擎和innodb引擎不同
1、在磁盘上创建的文件不同
2、myisam不支持事务、innodb支持事务【有事务的日志】
/app/mysql/data/ib_logfile0和ib_logfile1【事务日志文件】
很多事情在现实生活中都是事务的概念,当你要使用计算机帮你完成一些操作时,必须要加上事务,否则实现不了!
比如去火车站买票,(1)一定是你先在网上付钱,(2)人家再把票给你。
前面的2个动作合到一起就是一个事务,不可分割的。【你把钱付了,人家不给你票,你能干吗?我把票给你,你不给我钱,我肯定也不干。】
所以为了满足这笔交易呢,必须要有一个事务的概念在里面。
ACID
特点1:原子性【不可分割,要么成功,要么失败】
(1)如果你给了我钱,但是票卖光了,我必须要把钱退给你。
(2)如果你给了我钱,突然停电了、宕机了,再次恢复时,我有2种选择,要不我把票给你,要不我把钱还给你。
特点2:隔离性
比如你去银行取钱,一张卡你和你媳妇同时从机器取钱,卡上有1W元,能取出多少钱?
在取钱的过程中,涉及到事务的另外一个特点隔离,即使你和你媳妇同时取钱,你两的动作是被隔离开的,在同一时间只能有一个人对这个事情操作。
特点3:持久性
你买票,你把钱给我了,我把票给你了,这事就到此完事了。
特点4:一致性
比如有两个表(员工\职位),员工表中有员工代码、姓名、职位代码等属性,职位表中有职位代码、职位名称、职位等级等属性。
你在其中员工表中进行了插入操作,你插入了一个新员工的信息,而这个新员工的职位是公司新创建的一个职位。
如果没有一致性的保证,就会出现有这么一个员工,但是不知道他到底担当什么职责!
A:原子性,即要么泡妞成功,要么泡妞不成功,绝对不能出现暧昧不清的情况
C:一致性,即如果对方对你好,你就不能耍脾气,也要对对方好,状态要保持一致
I:隔离性,谈恋爱期间钱归钱,爱归爱,两者不能混淆,爱不应受到穷富的干扰
D:持久性,这个你懂的。。。。。。。别误解了,我指的是恋爱这个应该是一辈子的,是永久性的。
在做事务处理的时候,还是以买火车票的这个例子,当你把钱给我之后,我必须有2种选择,要么把票给你,要么把钱还给你。
(1)把钱还给你【rollback回滚到以前,undo】
(2)把票给你【确认进展下去,redo】
如何在数据库层面,保证事务?
就是你把钱给我,停电了。在电源恢复之后,系统完全正常后,如何解决redo和Undo问题呢?
通过日志来解决
你把钱给我的时候,我记录一下,哪年哪月哪日你给我钱了,要买火车票。这个时候我是没有进行数据的操作,我是先记日志后操作。
这时候如果掉电了,或者发生其它异常情况了,我的日志记录完了,在系统恢复正常之后,我只要查看一下日志,之前有人把钱给我了,
我看还有没有票,如果有票就进行redo,把事情做完,把票给你。如果没有票了,进行undo,我把钱退给你就行了。
3、foreign key 外键(innodb支持、myisam不支持)
text 类型索引(myisam支持、innodb不支持)【老版本中的特性,在5.6中支持】
create table a1(a text) engine=innodb;
alter table a1 add key lifei (a(10));
create table a2(a text)engine=myisam;
alter table a2 add key lifei2 (a(10));
MySQL不允许在BLOB/TEXT,TINYBLOB, MEDIUMBLOB, LONGBLOB, TINYTEXT, MEDIUMTEXT, LONGTEXT,VARCHAR建索引,
因为前面那些列类型都是可变长的,MySQL无法保证列的唯一性,只能在BLOB/TEXT前n个字节上建索引,
对于gbk(一个汉字占两个字节)编码的字段,只能前383个字符建索引;对于utf8(一个汉字占三个字节)编码的字段,
只能前255个字符建索引;对于latin编码的字段,只能前767个字符建索引;
4、对锁的颗粒度不同
(颗粒度:锁的单位大小不同,myisam锁整个表,innodb锁一行。)
比如:
有1张student表,表中有100条记录。
给myisam引擎加了个读锁,有一个会话在操作这张表,其它人就不能再操作这一整张表。
那inodb引擎呢?行级锁
一个会话操作第1条记录,其它99条还是可以被别的会话操作的。
并发性:因为Innodb可以很多人操作同一张表,只要操作的不是同一行记录就行。
而myisam引擎呢,是整个表。所以在并发性的角度看,innodb的并发性高于myisam。
但不是说innodb就比myisam快,往表中导入同样数据时,还是myisam的快。
只是说并发性好,以后考虑到哪个表用哪个引擎快的时候,要根据不同的情况。
比如:
有很多会话同时操作一张表,肯定innodb引擎好
如果只有一个会话操作一张表,肯定myisam引擎好