码迷,mamicode.com
首页 > 数据库 > 详细

Mysql(2)

时间:2019-11-18 20:20:51      阅读:92      评论:0      收藏:0      [点我收藏+]

标签:否则   dirty   持久化   png   res   回滚事务   variables   local   类型   

数据库事务(Database Transaction):

是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。

简单的说:事务就是将一堆SQL(通常是增删改操作)的执行绑在一起,要么都执行成功,要么都执行失败,即都执行成功才算成功,否则就会恢复到这堆SQL执行之前的状态。

事务的四大特性(ACID):

(1)原子性(Atomicity):事务中所有操作是不可再分割的原子单位。事务中所有操作要么全部执行成功,要么全部执行失败。

(2)一致性(Consistency):事务执行后,数据库状态与其它业务规则保持一致。如转账业务,无论事务执行成功与否,参与转账的两个账号金额之和应该是不变的。

(3)隔离性(Isolation):隔离性是指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会相互干扰。也就是说,在事中务查看数据更新时,数据所处的状态要么是另一事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看到中间状态的数据.

(4)持久性(Durability):一旦事务提交成功,事务中所有的数据操作都必须被持久化到数据库中,即使提交事务后,数据库马上崩溃,在数据库重启时,也必须能保证通过某种机制恢复数据。

 MySQL中的事务:

  •  开启事务:start transaction;
  •   结束事务:commit(提交事务)或rollback(回滚事务)。

 事务并发读问题:

多个事务对相同的数据同时进行操作,这叫做事务并发。

在事务并发时,如果没有采取必要的隔离措施,可能会导致各种并发问题,破坏数据的完整性等。这些问题中,其中有三类是读问题,分别是:脏读、不可重复读、幻读。

(1)脏读(dirty read):读到另一个事务的未提交更新数据,即读取到了脏数据;

例如:A给B转账100元但未提交事务,在B查询后,A做了回滚操作,那么B查询到了A未提交的数据,就称之为脏读。

(2)不可重复读(unrepeatable read):对同一记录的两次读取不一致,因为另一事务对该记录做了修改(是针对修改操作)

例如:在事务1中

1.1 事务隔离级别:

事务隔离级别分四个等级,在相同数据环境下,对数据执行相同的操作,设置不同的隔离级别,可能导致不同的结果。不同事务隔离级别能够解决的数据并发问题的能力也是不同的。

set tx_isolation=‘read-uncommitted‘;

1、READ UNCOMMITTED(读未提交数据)

安全级别最低, 可能出现任何事务并发问题(比如脏读、不可以重复读、幻读等)

性能最好(不使用!!)

2、READ COMMITTED(读已提交数据)(Oracle默认)

防止脏读,没有处理不可重复读,也没有处理幻读;

性能比REPEATABLE READ好

3、REPEATABLE READ(可重复读)(MySQL默认)

防止脏读不可重复读,不能处理幻读问题;

性能比SERIALIZABLE好

4、SERIALIZABLE(串行化)

不会出现任何并发问题,因为它是对同一数据的访问是串行的,非并发访问的;

性能最差;

存储引擎

show engines

show variables like ‘%storage_engines%‘

InnoDB

MyISAM

技术图片

 

 SQL性能下降原因:

技术图片

 

 SQL执行顺序

 技术图片

 

 

 

手写

 技术图片 

机读

技术图片

总结:

技术图片

 

 

 

索引

索引是存储引擎用于快速查找记录的一种数据结构

索引可以包含一个或多个列的值,如果索引包含多个列,那么列的顺序也十分关键,因为Mysql只能高效的使用索引的最左前缀列。

分类:索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。

索引的类型

B-tree索引 :当人们讨论索引的时候,如果没有特别指明类型,那多半说的是B-tree索引,它使用B-Tree数据结构来存储数据(按照顺序),大多数Mysql引擎都支持这种索引,Archive除外。

哈希索引:哈希索引基于哈希表实现,只有精确匹配索引所有列的查询才有效,对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码,哈希码是一个较小的值,并且不同键值的行计算出来的哈希码也不一样。哈希索引是将所有的哈希码存储在索引中,同时在哈希表中保存指向每个数据行的指针。在Mysql中,只有Memory引擎显式支持哈希索引。

空间数据索引(R-Tree):MyISAM表支持空间索引,可以用作地理数据存储。

全文索引:全文索引是一种特殊类型的索引,它查找的是文本中的关键词,而不是直接比较索引中的值。

可以使用SHOW INDEX FROM table_name;查看索引详情

索引种类

1.普通索引 INDEX

最基本的索引,它没有任何限制。

可以通过ALTER TABLE table_name ADD INDEX index_name (column);创建普通索引

2.主键索引 PRIMARY KEY

它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引。

注意:一个表只能有一个主键

3.唯一索引 UNIQUE

唯一索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。

可以通过ALTER TABLE table_name ADD UNIQUE (column);创建唯一索引

可以通过ALTER TABLE table_name ADD UNIQUE (column1,column2);创建唯一组合索引

4.组合索引 INDEX

组合索引,即一个索引包含多个列。多用于避免回表查询。

可以通过ALTER TABLE table_name ADD INDEX index_name(column1, column2, column3);创建组合索引

5.全文索引 FULLTEXT

全文索引(也称全文检索)是目前搜索引擎使用的一种关键技术。

可以通过ALTER TABLE table_name ADD FULLTEXT (column);创建全文索引

索引一经创建不能修改,如果要修改索引,只能删除重建。可以使用DROP INDEX index_name ON table_name;删除索引。

索引的优缺点

1、优点:

a)大大加快数据的检索速度;
b)创建唯一性索引,保证数据库表中每一行数据的唯一性;
c)加速表和表之间的连接;
d)在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。

2、 缺点:

a)索引需要占物理空间。
b)当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。

 视图

视图本身是一个虚拟表,不存放任何数据。在使用SQL语句访问视图的时候,它返回的数据是Mysql从替他表中生成的。视图和表是在同一个命名空间。

不能对视图创建触发器,也不能使用drop table 命令删除视图。

 创建视图
create [or replace] [algorithm={undefiend | merge | temptable}] view viem_name [column_list] as select_statement [with [ cascaded| local] check option]
例:create or replace view staff_list_view as select s.taff_id, s.first_name,s.last_name ,a.address from staff as s, address a where s.address_id = a.address_id
修改视图
alter  [or replace] [algorithm={undefiend | merge | temptable}] view viem_name [column_list] as select_statement [with [ cascaded| local] check option]
删除视图
drop view [if exists] view_name [ view_name].....
查看视图
show tables 
 
 

Mysql(2)

标签:否则   dirty   持久化   png   res   回滚事务   variables   local   类型   

原文地址:https://www.cnblogs.com/ming-long/p/11854750.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!