1.课程回顾
存储过程实际是存储在数据库内,可以由应用程序通过调用来执行,而且允许用户声明变量以及进行有条件的执行。存储过程可以包含程序流;逻辑;对数据库的查询。
2.Mysql存储引擎简介
在今天的学习当中,我们主要来学习Mysql中的存储引擎。
查看数据表的创建命令:SHOW CREATE TABLE tbl_name;,查看之后我们发现结果中含有一条ENGINE=InnoDB,这条就是指的存储引擎。首先我们了解一下什么是存储引擎。
- MySQL可以将数据以不同的技术存储在文件(内存)中,不同的技术就称为存储引擎。每种存数引擎使用不同的存储机制、索引技巧、锁定水平,最终提供广泛且不同的功能。
- 使用不同的存储引擎也可以说不同类型的表,因为关系型数据库当中数据的存储是以表的形式来实现的,所以存储引擎也可以称之为表类型。
- MySQL支持的存储引擎:
MyISAM
InnoDB
Memory
CSV
Archive
3.MySQL 相关知识点之并发处理
在具体的讲解引擎的特点之前,我们首先需要清楚几个简单的知识点:
并发控制-当多个连接对记录进行操作时保证数据的一致性和完整性。比如说一个购物系统后台登陆两个账户,一个在删除id为22的商品,一个又在访问22号商品的信息,就会出错。解决这类问题的方法就是并发控制,在处理并发读或者并发写时,系统会使用一套锁系统来解决这个问题,这个锁系统由两类锁来组成,分别是共享锁(读锁),排他锁(写锁):
共享锁(读锁):在同一个时间段内,多个用户可以读取同一个资源,它是共享的,读取过程中数据不会发生任何变化。
排他锁(写锁):在任何时候只能有一个用户来写入资源,当进行写锁时会阻塞其他的读锁或写锁操作。
既然有锁我们还要了解一下锁的力度,也就是锁的颗粒。所谓锁的颗粒,指的是锁定时的单位,我们其实只需要对所修改的数据精确加锁,而无需对所有的资源都进行加锁。假如我们在某个数据库当中存在着用户表和商品表,当用户登陆后尤其是在修改个人的注册信息的时候,我们只需要对用户表或者用户表中的某个记录加锁,而不需要对商品表加锁,商品表同理。
简而言之加锁我们只加对的,不加大的,加锁肯定会增加系统的开销,所以我们在锁策略与锁开销,数据安全之间寻求一种平衡。
Mysql的锁策略主要包括两种类型的锁表锁和行锁,锁颗粒:
表锁,是一种开销最小的锁策略。
行锁,是一种开销最大的锁策略。
表锁,当用户对数据表操作时,用户则获得了这张表的解锁权限, 解锁会禁止其他用户来进行读写的操作,而行锁是一种开销最大的锁的策略,也是支持最大并发操作的一种情况。
4.Mysql相关知识点之事务处理
事务处理,事物是数据库区别于文件系统的重要特征之一,事物的主要作用在于保证数据库的完整性。
例如:用户A像用户B转账200元,A要减少B要增加,在某个环节出错时要能保证AB回复到原始状态。整个过程每一个单元全部完成才算事务处理成功,某一个单元失败事务就会回滚.
事务的特性:
原子性、一致性、隔离性、持久性,英文简称ACID,具体的单词如下:
简称:A(Atomic)C(Consistency)I(Isolation)D(Durable)。
5.Mysql相关知识点之外键和索引
外键是保证数据一致性的一种策略。
索引是对数据表中的一列或多列值进行排序的一种结构。使用索引可以快速的访问数据表中的特定信息,索引是进行记录快速定位的一种方法,它就像是书的目录,如果要快速找到信息自然要先从目录去查找。索引我们还可以划分为普通索引,唯一索引和全文索引等等。
6.Mysql各个存储引擎特点
存储限制:存储引擎Memory的存储限制是由内存的大小来决定,它实际是存储在内存中的 。
事物安全:只有InnoDB支持。
索引:普通索引、唯一索引、全文索引、btree索引、hash索引……
还有其他存储引擎,比如
CSV,它实际是由,逗号分隔的存储引擎,它会在数据库的子目录里面对每一个表来创建一个.csv的文件,这是一种普通的文本文件,每一个数据行占用一个文本行,当然CSV(分隔符值)存储引擎不支持索引。
BlackHole,黑洞引擎,写入的数据都会消失,一般用做数据复制的中继。
这两种一般使用的不是特别多,我们可以结合存储特点来选择使用相应的引擎,目前使用最广泛的两种存储引擎:MyISAM/InnoDB
MyISAM:适用于事务的处理不多的情况。
InnoDB:适用于事务处理比较多,需要有外键支持的情况。
在一些大公司还会对数据引擎进行扩展,这就不是一般的程序员而是需要大牛来完成的。
9.设置存储引擎
修改存储引擎的方法主要有两种:
第一种通过修改Mysql配置文件my.ini来实现 default-storage-engine=engine_name
第二种方法通过创建数据表的命令来实现:
<1>CREATE TABLE tbl_name(
...
...
)ENGINE=engine_name;
<2>ALTER TABLE tbl_name ENGINE=engine_name;