一、索引

(1)什么是索引

索引是一种特殊的数据库结构,它包含着对数据表里所有记录的引用指针,根据这个指针我们就可以找到这个指针所对应的记录。可以对表中的一列或多列创建索引,并指定索引的类型,各类索引有各自的数据结构实现。从某种程度上说,索引就相当于一本书的目录,根据这个目录中所写的页码我们就能更快的找到我们需要的内容。除了提高检索速度外,索引还可以强制表中的行具有唯一性,从而确保数据的完整性。

(2)索引要解决什么问题

数据库中的数据很多,比如说当我们在一个表中要查找一条记录的时候,就必须从头扫描这个表,看哪条记录是我们想要找的,这样查找就很慢。那么索引就是为了***加快查找的效率***。

缺点:如果在一个表中创建大量的索引,就会影响插入、删除、更新数据的性能,增加索引调整的成本,降低系统的响应速度。

(3)索引的底层数据结构

a)为什么不使用哈希表:

哈希表的查找过程:哈希表查找时,是把key代入哈希函数,通过哈希函数计算对应的下标,再根据下标找到对应的链表,再去遍历key是否相等。

哈希表只能处理相等的情况。

比如:select * from student where score=90.5

但是不能处理 select * from student where score>90.5 and score <95.5这样的情况

b)为什么不用二叉搜索树

二叉树的那个节点最多有两个分支,当有大量数据时,用二叉搜索树存储时,这棵树的高度就比较高,查找效率也不高。

c)什么是B树(也称作B-树),它的优势是什么

数据库索引 字符串 数据库索引索引_表名


B树是个有序的N叉树,它的每个节点可以存储多个数据,因此在存储大量数据的时候,树的高度就大大减小了。从这棵树的结构来看,一个节点的出度=该节点可以存储的数据数目+1。用专业一点的语言描述就是一个内结点x若含有n[x]个关键字,那么x将含有n[x]+1个子女。

d)什么是B+树,它的优势是什么

在B+树里面,非叶子节点不再存储数据,仅仅存在索引,而叶子节点用来存储具体的数据,并且最底层的数据之间从左到右是按照从小到大的顺序分布,并且是一个链表的结构。

数据库索引 字符串 数据库索引索引_数据库_02


从这棵树的结构来看,一个节点能存多少数据,那么它就有多少个子女。

索引加快了查询效率,减慢了插入、删除、修改效率(需要同步修改索引),也会占用格外的空间。

(4)索引的应用场景

索引适用在查找操作频繁,但插入、删除、修改操作都不频繁的场景。

(5)使用索引(举例)

a)在创建主码(Primary key)、唯一约束(unique)、外键(foreign key)时会自动创建索引;

b)查看索引:show index from 表名;

c)创建普通索引:create index from 索引名 on (表名)列名;

d)删除索引:drop index 索引名 on 表名

(6)索引的分类:

a)单值索引

b)唯一索引

c)主键索引

d)复合索引

e)覆盖索引

f)聚集索引

g)辅助索引

(7)索引什么时候失效

a)在where子句中进行null值判断

b)在where子句中进行不等于!=、<>的判断

c)在where子句中进行or值连接,因为只要有一个属性没有创建索引,就会失效

d)使用模糊查询,”%san"这样的

e)使用函数操作

二、事务

(1)什么是事务

将一组操作封装起来就是事务,称为一个共同的执行单元。

(2)事务的基本特性

a)原子性:事务中的若干操作,要么全部成功,要么全部不执行(其实这里并不是没有执行,而是说在执行的过程当中某个步骤出错,就把前面已经执行完毕的步骤回滚(roll back)。

b)一致性:执行事务前后,数据始终处于合法的状态。

c)持久性:事务一旦执行完成,此时对于数据的修改就是持久生效的,修改结果写入了磁盘中。

d)隔离性:多个事务并发执行时,事务之间不能相互干扰。

(3)事务并发操作可能会带来的问题

a)脏读:一个事务读取了另一个事务未提交的数据。事务A在修改表中的某个数据,事务B读取了修改后的内容,但是A并没有提交,此时B的操作就是脏读。

b)不可重复读:一个事务在执行过程中,两次读取到的数据不相同。事务A读取了某个数据,事务B修改这个数据,事务A再次读取,发现两次读到的结过不一样。

c)幻读:一次事务执行过程中,两次读到的结果集不一样。事务A读取了表中的记录数,事务B对整个表进行操作,比如说增加了一行记录,此时事务B再读,发现结果集不一样。

(4)事务的隔离级别

a)read uncommitted 读未提交:允许读取未提交的数据,此时会发生脏读的问题。

b)read committed读已提交:只允许读取已提交的数据,(给写加锁,解决了脏读的问题,但是又不可重复读的问题)。

c)repeatable read::(Mysql默认隔离级别),(给读加锁,解决了不可重复读的问题,但是会有幻读的问题。

d)serializable严格串行化:解决了幻读问题。

(3)使用事务

start transaction; 开启事务

SQL语句

roll back;//commit; 事务结束,开始执行