索引:(用空间换时间)
定义:相当于一本书的目录,用于加快查找书中某一页的效率.
EG:以查找为例:
如果是顺序表查找,顺序表在内存中.内存访问速度很快,而且数据也没有很多,所以速度还可以.
如果针对数据库进行顺序查找,数据库的数据在磁盘上,磁盘的访问速度很慢,并且此时的数据可能会非常得多,因此导致查找的速度很慢,效率很低.
解决的问题:快速定位,检索数据.加快查找的效率.
应用的场景:
1.数据量较大,且经常对这些列进行条件查询。删除 修改 增加不常见
2.该数据库表的插入操作,及对这些列的修改操作频率较低。
3.索引会占用额外的磁盘空间。
索引可以考虑的数据结构:
1.二叉搜索树 :中序遍历结果是有序的
缺点:每个树只有两个叉,当树的深度比较高的时候查找效率就比较低.
针对树的中序遍历也不是很高效O(N)
2.哈希表:数据库的索引可以考虑哈希,但是哈希也有一些问题无法处理.
哈希是把key代入哈希函数中计算下标的值,根据下标取到对应的链表,再去遍历比较key是否相等.
哈希的时间复杂度O(1)查找的时间效率很高但是只能处理相等的情况,(< > >= between.and)这些情况无法处理.
因此引入B+树
先来看看B树:
B树的优点:查找效率比二叉搜索树快很多 同时处理范围查找更容易一些
但是B树在Mysql这种关系型数据库中不是很适用
B+树:
其他注意事项:
索引的效果:
1.优点:加快查找效率
2.缺点:对于插入,删除,修改数据(需要重新调整索引结构) 会减慢效率
会占用额外的空间(内存 磁盘)
3.创建索引,删除索引都是比较耗时的操作最好避免在线上操作 先准备好在启动服务器
4.主键索引的叶子节点存储的是数据的完整记录
其他索引的叶子节点存的是主键的id
比如
创建主键约束 外键约束 唯一约束时会自动创建对应列的索引
补充1:
补充2:
索引对应的mysql:
1.查看索引:
2.创建索引:
3.删除索引:
事物:
定义:把一组操作封装在一起.成为了一个共同的执行单元.
特性:
1.原子性(最重要):事物的若干个操作要么就全部执行成功,要么就全不执行(如果中间某个步骤出错就把之前的步骤回滚回去 还原原来造成的影响)
2.一致性:执行事物前后 数据一直处于一种合法状态
3.持久性:事物执行完毕 对数据的修改持久有效(写入磁盘)
举个栗子:
我妈现在要给我转1000生活费 在她的卡里扣1000(如果给我转完她的账户负的了就不符合一致性) 我的卡里就要增加1000这就叫做原子性 给我转1000之后这笔钱就任我挥霍了这就叫做持久性
4.隔离性(复杂):“并发执行事物”
写在前面:[针对以下几点好好准备]
事物隔离的四个级别:
读已提交 读未提交 可重复读 串行化
并发执行事物时会产生的问题:
再举个栗子:
单纯的觉得画图好用! 画图怎么这么好用 爱了爱了! 太傻了之前没发现!