今天学习的内容主要为:
1.自增长
2.索引优化速度
3.事务
一、自增长
1. 自增长关键字:AUTO_INCREMENT
2. 可以使整数型和浮点型的字段每+1的形式自行添加(浮点数再此方面用的不多)
3. 一般是配合着主键primary key去进行使用,如不使用主键进行字段的修饰,则需要使用到unique
4. 自增长默认从1开始,但也可以使用:
ALTER TABLE 表名 AUTO_INCREMENT = xxx 来进行修改
例:
CREATE TABLE table01 (
id INT PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(32) NOT NULL DEFAULT '')
INSERT INTO table01 VALUES (null,'YG')
虽然此时id字段处填写的是null,但mysql会自动给id赋默认值,即id = 1
INSERT INTO table01 VALUES (null,'mxh')
此时的id经过自增长,id = 2,以此类推
二、索引优化速度
1. 当在海量的表中进行数据的查询时,速度会非常的慢,这是因为mysql数据库默认使用的查询方式是:全表扫描 (即一行一行的进行查询)
2. 此时,就可以建立索引,极大的提升在海量表中查询数据的速度。原理是:会形成索引的数据结构,比如像:二叉树数据结构等等,非常利于数据的检索
3. 有利就有弊。虽然建立索引,极大的缩减了查询的时间,但由于索引自身会占用一定的内存空间,所以会使表中的内存增大,占用磁盘;
对dml (insert,update,delete)语句的效率影响:建立索引后,会形成一个固定的数据结构,此时对表中的数据进行增删操作的话,会打破原有的数据结构,使得不得不生成一个新的数据结构。
4. 索引的类型主要分为以下几种:
(1)主键索引,如在字段中添加了主键,则也会被自动的认为是一个主键索引
也可以使用 ALTER TABLE 表名 ADD PRIMARY KEY (字段名)在已经生成了表的情况下,
添加主键索引
(2)唯一索引 UNIQUE
(3)普通索引 INDEX
创建唯一索引和普通索引的方法有两种:
CREATE INDEX 索引名 ON 表名(字段名)
ALTER TABLE 表名 ADD (UNIQUE) INDEX (字段名)
(4)全文索引 FULLTEXT 【适用于MyISAM】
一般来说,不会使用mysql数据库自带的全文索引功能
5. 删除索引方法:
分主键删除法和其他索引删除法:
删除主键:
ALTER TABLE 表名 DROP PRIMARY KEY
其他索引删除法 :
DROP (UNIQUE) INDEX 索引名 ON 表名
6. 修改索引的原理:先DROP删除掉原有的索引,在重新创建一个新的索引即可
7. 查询此时表的索引:SHOW INDEX FROM 表名
8. 在索引的选择上:如果数据不会重复,则使用UNIQUE;反之使用普通索引
9.因为dml语句中不包含select,所以在查询任务重且多的表中创建索引
虽然查询数据多,但唯一性太差,此时不太建议创建索引
表中的数据若需频繁的更新,也不推荐在此创建索引
三、事务即事务的隔离级别
事务保证数据的一致性,一组相关的dml语句要么全部成功,要么全部失败,最典型的例子莫过于转账问题
mysql数据库事务的重要操作:
1.START TRANSACTION - 开始事务方式一
SET autocommit = off - 开始事务方式二
2.SAVEPOINT - 设置保存点
3.ROLLBACK TO 保存点名 - 回退事务 (回滚)
4.ROLLBACK - 回退全部事务
5.COMMIT - 提交事务
当你开始事务后,在未提交事务之前,所增删改的数据并不会在别的连接上显示
回退事务:当你先设置了保存点a,并update了一条数据,在设置了一个保存点b,此时你ROLLBACK TO a,先前update的那条dml语句就会被撤销,通俗点讲:mysql吃了后悔药
提交事务:当执行了commit语句后,会确认事务的改变、结束事务、删除保存点、释放锁并且数据正式生效。当你提交事务后,想在回过头来进行回滚的操作,这肯定是不可能实现的。即已经吃不到后悔药了。
并且我们知道,默认情况下,也就是还没有开启事务前,dml语句是默认提交的,所以并不能回滚。
并且事务对表的存储引擎也是有要求的:只有InnoDB的存储引擎才可以使用事务,别的存储引擎都是不可以的。
四、事务隔离级别
事务隔离级别是指事务与事务之间的隔离程度。通俗点讲:事务a和事务b同查询一张表,但事务a所能看到的数据和事务b所能看到的数据是有区别的。
如果不考虑隔离级别,可能会产生如下问题:脏读、不可重复读和幻读
脏读:当一个事务读取到了另一个事务尚未提交的数据。
不可重复读:已提交,但是由于所做的 修改或
删除操作,导致你每次查询到的数据可能都不一样。
幻读:已提交,但是由于所做的 插入操作,导致每次查询到的数据可能都不一样
事务的隔离级别分四种:
1. 读未提交 (read uncommitted)
2. 读已提交 (read committed)
3. 可重复读 (repeatble read)
4. 可串行化 (serializable)