一.数据库索引
索引的概念:
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。(如果按特定职员的姓来找他,则与在表中搜索的行相比,索引有助于更快的获取信息。
DB在执行一条Sql语句的时候,默认方式是根据搜索条件进行全表扫描,遇到匹配条件的就加入搜索结果集合。如果我们对某一字段增加索引,查询时就会先去索引表中一次定位骚特定值的行数,大大减少遍历的行数,能明显增加查询的速度。
索引的目的
索引的目的就是加快检索表中数据的方法。
索引的分类
主键索引(加速主键作为查询条件,where和on后面的条件),
唯一索引
普通索引
索引的实现方法
一般分为B+树和哈希索引
B+树索引:在B-tree上改进得到,其非叶子节点均为key值,叶子节点是key-data键值对。叶子节点前后相连且有序。
哈希索引:通过key进行hash而将记录存储在不同的哈系桶中,默认无序。
为什么有了B+树索引还要hash索引?
1)B+树默认有序,hash默认无序,所以哈希索引无法用于排序;
2)哈希索引O(1)在速度上毋庸置疑快于B+树近似O(logn);
3) 哈希索引只能进行等值查询(因为它要计算hash(key)再去匹配,而B+树索引可以进行等值,部分前缀,范围查询;
4)底层实现结构不同:B+树是非线性结构,hash桶是线性结构。
5)对于某些场景如热点页、活跃查询页,需要借助哈希索引来实现快速查询。
索引的优缺点
1.优点:
1)通过创建唯一性索引,可以保证数据库表中每一行数剧的唯一性。
2)可以大大加速数据的检索速度。这也是创建索引的最主要原因。
3)可以加速表和表之间的连接。特别是在实现数据库的参考完整性方面
4)在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
5)通过使用索引,可以在查询过程中,使用优化隐藏器,提高系统的性能。
2.缺点:
1)创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
2)索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如过要简历聚簇索引,那么需要的空间就会更大。
3)当对表中的数据进行增加,删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
多加索引一定好吗?
当修改性能远远大于检索性能时,不应该创建索引。这是因为修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。
二.数据库事务
数据库事务,是指作为单个逻辑工作单位执行的一系列操作,要么完全执行,要么完全地不执行。事务还规定不同的客户端看到的数据是不相同的。
事务的概念
事务是由一系列对系统中数据进行访问与更新的操作所组成的一个执行逻辑单元。事务是DBMS中最基础的单位,事务不可分割。
事务的ACID特性
1.原子性(Atomicity):事务是应用中最小的执行单位,就如原子是自然界的最小颗粒,具有不可再分割的特性。
2.一致性(Consistency):事务执行的结果,必须使数据库从一个一致性的状态变换成另一个一致性的状态。当数据库只包含事务提交的结果时,数据库处于一致的状态。如果系统运行发生终端,某个事务尚未完成而被迫中断,而改未完成的事务对数据库所做的修改已被写入数据库,此时数据库就是一种不正确的状态。因此一致性是通过原子性来保证的。
3.隔离性(Isolation):各个事务互不干扰,任意一个事务的内部操作对其他并发事务都是隔离的。也就是说,并发执行的事务之间不能看到对方的中间状态,并发执行的事务之间不能互相影响。
4.持久性(Durability):指一个事务一旦被提交,它对数据库所做的改变都要记录到永久存储其中。
数据库事务隔离
同一时间,只允许一个事务请求同一个数据,不同事务之间彼此没有干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。
事务隔离级别
Read Uncommitted(读未提交):一个事务可以读到另一个事务未提交的结果。
Read Commited(读已提交):只有在事务提交后,其更新结果才会被其他事务看见。可以解决脏读问题。
Repeated Read(可重复读):在一个事务中,对于同一份数据的读取结果总是相同的,无论是否有其他事务对这份数据进行操作,以及这个事务是否提交。可以解决脏读,不可重复读。
Serialization(可串行化):事务串行化执行,隔离级别最高,牺牲了系统的并发性。可以解决并发事务的所有问题。
无隔离性的问题
1.脏读:一个事务可以读到另一个事务未提交的结果。
2.不可重复读:一个事务多次读同一个数据,在这个事务还没结束时,另一个事务如果访问同一个数据并进行修改,那么第一个事务两次读取的内容可能不一样,称为不可重复读。
3.幻读:一个事务对表中的数据进行修改,涉及到表中的全部数据行,同时,第二个事务修改这个表中的数据,这种修改是向表中插入一行新数据,那么第一个事务的用户发现表中还有未修改的数据行,就好像发生了幻觉一样。
备注:不可重复读的重点是修改,同样的条件,你读取过的数据,再次读取出来法现值不一样了,幻读的重点在与新增或者修改,同样的条件,第一次个第二次读取的记录数不一样
来源:oschina
链接:https://my.oschina.net/u/4373225/blog/4480774