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引擎好







原文地址:https://www.cnblogs.com/xiaoxiao5ya/p/174ced3712ea14ebf91eb59879384345.html