MySQL存储引擎

存储引擎是什么?

show engines\G  #查看所有引擎

MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。

例如,如果你在研究大量的临时数据,你也许需要使用内存存储引擎。内存存储引擎能够在内存中存储所有的表格数据

MyISAM引擎

mysam: 拥有较高的插入,查询速度,但不支持事务

mysql> create table t4(id int,name char(10)) engine=myisam;

MRG_MYISAM引擎(只能基于MYISAM引擎)

create table t10(id int,name char(10)) engine=myisam; 创建基表t10

create table t20(id int,name char(10)) engine=myisam; 创建基表t20

create table t30(id int,name char(10)) union=(t10,t20) engine=mrg_myisam; MRG表T30

create table t40(id int,name char(10)) union=(t10,t20) INSERT_METHOD=first engine=mrg_myisam; MRG表指定插入表

MEMORY引擎

所有数据置于内存的存储引擎,拥有极高的插入,更新和查询效率。但是会占用和数据量成正比的内存空间。并且其内容会在Mysql重新启动时丢失

mysql> create table t3(id int,name char(10)) engine=memory;

BLACKHOLE引擎(黑洞引擎)

黑洞引擎,写入的任何数据都会消失,一般用于记录binlog做复制的中继

mysql> create table t3(id int,name char(10)) engine=blackhole;

INNODB引擎

5.5版本后Mysql的默认数据库,事务型数据库的首选引擎,支持ACID事务,支持行级锁定

1.外键

MySQL通过外键约束来保证表与表之间的数据的完整性和准确性。

 外键的使用条件:
    1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持);
   2.外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显示建立; 
   3.外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以;

外键的好处:可以使得两张表关联,保证数据的一致性和实现一些级联操作;

create table dpt(did int primary key,dname char(10));

create table emp(id int,name char(10),did int,foreign key (did) references dpt(did) );



insert into emp values(1,'tong',10);

insert into emp values(2,'tom',30);



alter table emp drop foreign key emp_ibfk_1;

alter table emp add foreign key (did) references dpt(did);

alter table emp add CONSTRAINT emp_dpt_fk foreign key (did) references dpt(did);

级联删除,级联更新

mysql> create table emp(id int,name char(10),did int,foreign key (did) references dpt(did) ON DELETE CASCADE on update cascade);

2.表级锁和行级锁

行级锁:对正在被修改的行进行锁定,其它的用户可以访问被锁定的行以外的行。表级锁:锁定整个表,限其他用户对表的访问

3.事物的支持

事务处理是一种机制,用来管理成批执行的sql语句,以保证数据库不包含不完整的操作结果,他们或者为整体执行完成,或者完全不执行(如果没有错误发生整组语句提交到数据库,如果发生错误,则进行回退,以保证数据的安全)

1·必须是innodb引擎

2事物针对会话生效(只在当前会话生效)

3事物的结束要么commit要么rollback

4事物是一次性的,只要commit或者rollback,在使用事物时需要重启开启

5·事物只针对DML语句,如遇到DDL DCL自动commit6事物中可以使用savepoint,可以根据savepoint回滚,但不结束事物

7.savepoint只能往后回滚,不能往前

事务 transaction 指定一组sql语句

回退 rollback 撤销指定的sql语句(只能回退insert delete update语句)

提交 commit 提交未存储的sql语句

保留点 savepoint 事务处理中设置的临时占位符 你可以对它发布回退(与整个事务回退不同)

create table t11(id int,name char(10)) engine=innodb;

mysql> insert into t11 values(1,'tong')
    -> ;
Query OK, 1 row affected (0.00 sec)

mysql> insert into t11 values(1,'tom');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t11 values(3,'jerry');
Query OK, 1 row affected (0.00 sec)

mysql> select * from t11;
+------+-------+
| id   | name  |
+------+-------+
|    1 | tong  |
|    1 | tom   |
|    3 | jerry |
+------+-------+
3 rows in set (0.00 sec)
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> delete from t11;
Query OK, 3 rows affected (0.00 sec)

mysql> select * from t11;
Empty set (0.00 sec)

mysql> rollback
    -> ;
Query OK, 0 rows affected (0.01 sec)

mysql> select * from t11;
+------+-------+
| id   | name  |
+------+-------+
|    1 | tong  |
|    1 | tom   |
|    3 | jerry |
+------+-------+
3 rows in set (0.00 sec)

提交

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t11 values(2,'dog');
Query OK, 1 row affected (0.00 sec)

mysql> select * from t11;
+------+-------+
| id   | name  |
+------+-------+
|    1 | tong  |
|    1 | tom   |
|    3 | jerry |
|    2 | dog   |
+------+-------+
4 rows in set (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

保留点

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t11 values(2,'dog');
Query OK, 1 row affected (0.00 sec)

mysql> select * from t11;
+------+-------+
| id   | name  |
+------+-------+
|    1 | tong  |
|    1 | tom   |
|    3 | jerry |
|    2 | dog   |
+------+-------+
4 rows in set (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t11 values(5,'haha');
Query OK, 1 row affected (0.00 sec)

mysql> savepoint insert1;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from t11;
+------+-------+
| id   | name  |
+------+-------+
|    1 | tong  |
|    1 | tom   |
|    3 | jerry |
|    2 | dog   |
|    5 | haha  |
+------+-------+
5 rows in set (0.00 sec)

mysql> delete from t11 where id=1;
Query OK, 2 rows affected (0.00 sec)

mysql> savepoint delete1;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from t11;
+------+-------+
| id   | name  |
+------+-------+
|    3 | jerry |
|    2 | dog   |
|    5 | haha  |
+------+-------+
3 rows in set (0.00 sec)

mysql> delete from t11;
Query OK, 3 rows affected (0.00 sec)

mysql> savepoint delete2;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from t11;
Empty set (0.00 sec)


mysql> rollback to delete1;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from t11;
+------+-------+
| id   | name  |
+------+-------+
|    3 | jerry |
|    2 | dog   |
|    5 | haha  |
+------+-------+
3 rows in set (0.00 sec)


mysql> rollback to insert1;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from t11;
+------+-------+
| id   | name  |
+------+-------+
|    1 | tong  |
|    1 | tom   |
|    3 | jerry |
|    2 | dog   |
|    5 | haha  |
+------+-------+
5 rows in set (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from t11;
+------+-------+
| id   | name  |
+------+-------+
|    1 | tong  |
|    1 | tom   |
|    3 | jerry |
|    2 | dog   |
+------+-------+
4 rows in set (0.00 sec)

savepoint查询 只能查有几个savepoint

[root@mail db]# vim /etc/my.cnf

[mysqld]

show_compatibility_56 = 1



[root@mail db]# systemctl restart mysqldd


mysql> select * from information_schema.SESSION_STATUS where VARIABLE_NAME like "%POINT%";
+----------------------------+----------------+
| VARIABLE_NAME              | VARIABLE_VALUE |
+----------------------------+----------------+
| COM_RELEASE_SAVEPOINT      | 0              |
| COM_ROLLBACK_TO_SAVEPOINT  | 0              |
| COM_SAVEPOINT              | 0              |
| HANDLER_SAVEPOINT          | 0              |
| HANDLER_SAVEPOINT_ROLLBACK | 0              |
+----------------------------+----------------+
5 rows in set, 1 warning (0.00 sec)

mysql>


 

mysql> select @@autocommit; #查询

当autocommit=0时 mysql默认开启事务:

当autocommit=1时 mysql默认关闭事务,需要手动开启 start transaction 默认1

mysql> set autocommit=0; #设置

永久生效,修改配置文件

[mysqld]

autocommit=0 #设置默认开启事物

skip-grant-tables #重置密码

socket=/var/lib/mysql/mysql.sock #套接字文件位置 必须是mysql可用创建文件的目录







[mysqld] 
socket=/var/lib/mysql/mysql.sock 

[mysql] 
socket=/var/lib/mysql/mysql.sock 
user=root 
password=123

Innodb数据文件的物理架构

emp.frm 表结构文件

emp.ibd 独立表空间(独立数据文件)

 

mysql的配置文件:/etc/my.cnf /usr/my.cnf /usr/local/mysql/my.cnf

独占表空间和共享表空间

innodb_file_per_table=1 独立

innodb_file_per_table=0 共享

mysql视图

视图是一个虚拟表,是sql的查询结果,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据,在使用视图时动态生成

单表视图

mysql> create view new_emp as select * from emp;

mysql> create view new_emp1 as select emp_id,emp_name,emp_money from emp;
Query OK, 0 rows affected (0.00 sec)

修改视图=修改源表

多表视图

create table tt1(id int,name char(10),did int);

create table tt2(did int,dname char(10));


mysql> create view emp_dpt_v as select emp_id,emp_name,dpt_name from emp,dpt where emp.dpt_id=dpt.dpt_id;


DROP view emp_dpt_v;

MyISAM

MyISAM是默认存储引擎。它基于更老的ISAM代码,但有很多有用的扩展。(注意MySQL 5.1不支持ISAM)。

每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名 为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。 MyISAM文件的格式是平台无关的,这意味着你可以将数据和索引文件从一个intel服务器上拷贝到一台PowerPC或者Sun SPARC上,而不会出任何问题。

主要区别:

  MyISAM是非事务安全型的,而InnoDB是事务安全型的。

  MyISAM锁的粒度是表级,而InnoDB支持行级锁定。

  MyISAM支持全文类型索引,而InnoDB不支持全文索引。

  MyISAM相对简单,所以在效率上要优于InnoDB,小型应用可以考虑使用MyISAM。

  MyISAM表是保存成文件的形式,在跨平台的数据转移中使用MyISAM存储会省去不少的麻烦。

  InnoDB表比MyISAM表更安全,可以在保证数据不会丢失的情况下,切换非事务表到事务表(alter table tablename engine=innodb)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值