目录
1.索引
1.1 何为索引
索引本质上就相当于书的“目录”,数据库通过这种“目录”,就可以快速找到某个章节对应的位置。
因此索引就是增加了数据库对查找数据的深度!
在前面学习过数据结构之后,我们就知道索引提高了查找效率的代价必定是增加对空间的开销!
索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引,并指定索引的类型,各类索引有各自的数据结构实现。
1.2 索引的用法
创建 primary key unique foreign key 时 会自动创建对应列的索引
对于非主键、非唯一约束、非外键的字段,可以创建普通索引~~
·查看索引
因为id时primary key 所以自动创建了索引
·创建索引
creat index 索引名 on 表名(列名)
创建索引的时候,最好在建表的时候就创建出来,否则,如果一个表有很多的记录,再来穿就按索引是非常危险的!
会吃掉大量的磁盘IO,花费很长的时间
1 索引是为了加快查询的速度,也不是所有的情况加上索引就一定快~~
2 如果name 的数据 有重复,索引能不能加上,会不会报错?不会报错,能加上.
3 只要你重名不是很多,这个时候,还是能大大提高查询的速度点.
·删除索引
这一次查询如果想知道是不是用的索引,可以使用explain关键字,显示处查询过程中,具体的使用索引情况!
explain语句可以分析sql的执行逻辑,顺序,是否使用索引等等。
索引提高查的效率,但会是降低其他的操作的效率(需要调整已经创建好的索引)
2.索引背后的数据结构
我们知道查找这一操作有时候可能会需要范围查询,但似乎哈希表并不能> 或者 < 因此,哈希表并不行~~
如果是二叉搜索树呢?可以实现范围查询,但是当数据多的时候,也就是元素个数多的时候,树的高度就会变大,而树的高度决定了查找的效率! 树的高度就需要控制~~
这时候就需要n叉搜索树(就是 每个节点有多个值 有多个分叉)~~
其用来控制树的高度、
而其中 最典型的实现就是 B树~~
数据库的看到的这个表 不一定按连续的空间来组织表这样的结构,很大概率是B+树(尤其是带主键的)
因此 提高查询的速度 本质就是降低IO操作
3. 事务
3.1 为啥用事务
在转账的情景下 : A向B转账100元,A的账户-100 而B确实+50 这显然是不合理的,因此只要出现这个操作就需要截止!
因此可以把+100 和 -100打包成一个操作,只要一个没执行完成 ,就全部推翻重来~~
3.2 事务
事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。
在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。
4.事务的特性
1.原子性
2.一致性 事务执行前/执行后,都是数据合法的状态,像刚才的转账,不能说转的过程出错了,导致钱丢的情况
3.持久性 事务的修改都是写入硬盘的
4.隔离性 一个数据库服务器同时 执行多个事务的时候 事务之间的 相互影响程度!
mysql服务器是需要给多个客服端提供服务的
有时候会同时有多个客服端对服务器进行访问,这时候会引发一些问题
隔离性越高,事务之间的并发性越低,执行效率就变满,数据的准确率就提高
隔离性越低,事物之间的并发性越高,执行效率就变满,数据的准确率就降低
因此mysql提供了不等隔离级别让我们选择~~
在学习不同的隔离级别之前,先学习一下~~
1.脏读问题
假设A向B抄作业,但是A抄写的方式和他人不同,A是和B边写边抄,突然B把前面的作业全部修改了,这时候A非常崩溃,这就是所谓的脏读问题~~
这些A已经抄写的数据就叫 脏读数据(dirty data) 意思是这个数据有问题~~
在这个场景中,A和B是完全并发的,不存在任何限制~~
解决方法很简单:降低并发性,增加隔离性~~(其实就是对“抄操作”进行上锁)~~
但上锁的时候,意思就是B在写作业的时候,不允许A进行“抄操作” ———相当于提高了隔离性,降低了并发性,运行效率降低,但是准确性相对的提高
2.不可重复性
当B写完作业交给A抄写的时候,突然B发现有一个作业写错了,这时候又要拿回作业重写,A又再一次的崩溃了~~
在一个事务中,连续俩次读到的数据,结果是不同的,这就叫做“不可重复性”
那么如何解决呢?
也很简单,在A抄作业的时候,就限制B不能拿回作业,也是对其上锁
这时候,这俩事务的并发程度又降低了,隔离性提高,运行效率进一步降低,提高了准确性
3.幻读问题
虽然啊,在B写作业的时候和A抄作业的时候都上锁了,但是B可以在A抄作业的时候,可以把作业拿走撕了,也可以再写其他的作业(给其再添加/删除 文件)A又双叒叕崩溃了
在同一事务中,连续俩次结果集不同,就叫做幻读
解决其方法:
彻底的舍弃并发
5.总结:
索引用在查询多的场景,大部分数据库引擎的索引背后的数据结构都是B+树,但也有例外
索引:
(1)对于插入、删除数据频率高的表,不适用索引
(2)对于某列修改频率高的,该列不适用索引
(3)通过某列或某几列的条件查询频率高的,可以对这些列创建索引
事务