Mysql数据库的索引、事务和存储引擎
一、mysql的索引
1.索引的概念:索引是一个排序的列表,在列表当中存储索引的值,以及索引值对应数据所在的物理行,索引值和数据是一个映射关系。
2.索引的作用:使用索引之后,就不需要扫描全表数据来定位某条数据,加快了数据的查询速度,索引可以是表中的一列也可以是多列;设置了索引之后数据库可以利用索引快速定位,能够大大提高查询速度,这也是创建索引的目的;尤其是在表的数据很多,以及涉及多个表查询时,索引可以大大提高查询速度;建立索引不仅仅查询可以提高效率,在恢复数据库的数据时也能提高性能;可以加快表与表之间连接查询的速度。
3.索引的副作用:创建的索引也是需要占用额外的磁盘空间;INNODB存储引擎表数据和索引文件在一块,相对来说占的空间小一点;一旦创建索引之后更新一个包含索引的表比没有索引的表需要花费更多时间,因为表要更新,数据也要更新,所以更新速度要慢一些;理想的做法是经常被做为搜索条件的列上创建索引。
4.创建索引的原则和依据:
表的主键和外键必须有索引,主键是唯一的,外键是关联主表的,查询时可以快速定位。
一张表有超过300行的数据,应该要创建索引。
经常与其他表进行连接的表,在连接字段上创建索引。
更新太平凡的字段不适合创建索引。
经常做为where语句的条件列,应该创建索引。
经常使用group by和order by的字段要创建索引。
选择一个性能高的字段也就是字段值不同的越多越好做为索引。
索引要建立在小字段上,字符串的长度比较小的字段,对于超文本字段不适合建立索引。
5.索引的类型:
b-tree索引:又叫b-树索引,绝大部分的数据都是使用b-树索引,从左到右按顺序进行排列匹配。
哈希索引:索引对应的哈希值的方法获取表的记录行,速度慢,一般不用。
6.如何创建索引:index
主键和唯一约束会默认自动添加索引,不需要刻意添加:
创建表的同时创建表内指定列的索引
在表外创建索引的两种方法
第一种:create index cardid_index on wc(cardid);
第二种: alter table wc add index id_index (id);
向表内同时插入多条数据:
查询当前表指定行使用索引的情况
创建唯一索引的两种方法:
如何删除索引的两种方法
创建组合索引
创建全文索引
使用全文索引查询:
select * from 表名 where match(列名) against('查询内容');
检测全文索引:
explain select * from 表名 where match(列名) against(查询对象);
7.索引练习:
二、mysql的事务:
1.事务:是一种机制,一个操作序列,也就是一组或者一条数据库的操作命令;MySQL把所有命令做为一个整体向系统提交或者撤销的操作,要么都成功,要么都失败,事务 保证了数据的一致性,事务是一个不可分割的工作逻辑单元,在数据上执行并操作时事 务是最小的控制单;mysql通过事务的控制和事务的整体性保证数据的一致性。
2.事务的特点:在数据库的管理系统中,事务的特性有A、C、I、D这四种。
A(ATOMICITY)原子性:事务的最小控制单元,不可分割,要么成功,要么失败。
C(consistency)一致性:事务开始之前和事务结束之后,数据库的完整性没有被破坏,也就是开始的时候数据是一致的,结束的时候也是一致的。
I(isolation)隔离性:并发环境中不同的事务同时操作相同的数据时,每个事务都有自己完整的数据空间,对数据的修改所发生的并发事务都是隔离的,每个事务之间都是独立,一个用户的事务不会被其它事务所干扰的。
数据库的隔离级别:
未提交读:read uncommitted RU允许脏读,一个事务可以看到其它事务未提交的修改。
提交读:read committed RC一个事务只能看到其它事务已经提交的数据,未提交的不可见,防止脏读 oracle sql sever。
可重复读:repeatable read RR一个事务在执行中,执行两次相同的select语句,得到的结果都相同。
串行读:完全串行化的读,一个事务在使用,其它事务读写都会阻塞。
不可重复读:在一个事务内,多次读同一个数据,一个事务没有结束,另外一个事务也在访问改数据,其中一个事务连续两次查询发现结果不一致。
幻读:一个事务对一个表的数据进行了修改,另外一个表也修改了表中数据,前一个事务会发现修改的结果不正确,类似于出现里幻觉。
不可更新: 两边同时对数据进行修改,但是一方先提交,一方后提交,后提交会覆盖先提交的。
D:durabillity持久性:一旦写入提交后无法更改。
3.事务控制语句:
begin:开启一个事务
start transaction:也是开启一个事务
commitl:提交事务
rollback:回滚
savepoint s1:设置回滚点
rollback to s1:回滚到s1还原点
三、MySQL的存储引擎:
1.概念:存储引擎就是一种数据库存储数据的一种机制,索引的技巧以及锁定水平,以上结合起来就是存储引擎。
2.存储方式及存储的格式:存储引擎也属于MySQL当中的组件,实际上操作的、执行的就是数据的读写I/O。
3.MySQL的存储分类:MySQL5.5版本之后默认开始使用innodb事务型速记存储引擎,支持ACID,支持锁定。
innodb存储引擎特点:支持读写阻塞(锁表)和事务的隔离级别;能够高效的缓存数据支持多种类的索引;表的索引的类型默认是btree;支持外键,支持全文索引,对硬件的资源要求比较高;行级锁定,会被行锁了禁止操作,尤其是模糊查询,在like进行查询时,会进行全表扫描,在扫描的过程中会锁定整个表,如果没有创建索引的列,进行查询时,也会锁定整个表,使用的时索引列,锁定条件的行,进行行锁定。
innodb行锁和索引的关系:行锁是通过索引来实现;如果没有索引,innodb会使用默认的隐藏索引来对记录进行加锁,加了索引就是锁行,不加索引就是锁表。
当指定条件不是索引的时候,会锁定整个表。
行锁:
两边begin 操作索引时,会形成行锁,一个发送另一个同一行改不掉
如果说使用的id的字段是主键,INNODB对主键使用聚簇索引,锁定整行的记录
解决方法:commit之后立即生效
4.死锁:事务相互等待对方的资源,最后形成一个环路造成的。
如果发生了死锁,数据库会自动选择一个事务做为受害者,它会回滚该事务以解除这个死锁;但当时MySQL的时候会终止其中一个事务,但是不会自动回滚。
for update 排他锁:当一个事务的操作未完成时,其他事务可以读取但是不能写入。
如何避免死锁的情况发生:以固定的顺序访问表和行;大事务尽量拆分成小的事务;为表添加一个合理的索引。