索引查询与普通查询的区别
普通查询 :执行步骤为先对表进行遍历,然后把当前的行带入条件中进行判断,符合条件执行,不符合跳出。这种情况在遇见数据较多的情况下就会出现问题,效率太低。
索引查询:是对查询操作的优化手段,通过索引可以加快查询的速度(一个索引是针对一列来进行指定的,只有针对这一列条件进行查询时,查询速度才会被优化),避免对表进行遍历。缺点 由于索引查询生成索引需要一些列的数据结构,这些数据存贮在硬盘上占用内存,其次引进索引后对数据修改删除插入还要对索引进行修改,因此对数据的插入修改删除的速度也会大大降低。
索引的操作
查看索引
show index from 表名;
不加约束时不会生成索引,下图案例在对索引查询的时候显示的就是空,主键,unique,外键都会生成主键。
使用主键,会自动生成索引。
外键约束的索引 :
创建索引
create index 索引名字 on 表名 (列名);
删除索引
drop index 索引名字 on 表名;
索引的背后逻辑(面试)
数据库索引的引入是一个改进的树形结构,B+树(N叉搜索树)。一个节点上存在N个key,划分成N个区间,每个节点上N个key中最后一个相当于当前子树的最大值,父节点上的每一个key都会以最大的身份在子节点的对应区间中存在因此父节点的key可能重复出现。B+树的最大优点就是,B+树会构成和链表一样的结构通过节点进行前后链接。这样在查询某一区间的数据只用知道首尾就可以把数据区间取出。相对于普通的树形结构减少了回溯的次数,减少了硬盘i/o的读取。
什么是事务
在早些年代会出现,A给B转了钱而B却并未收到,因此引入了事务中的回滚(指的是通过检查若没有执行成功就回退回去,比如A给B转了钱而B却并未收到时,那么就会触发回滚把A转出金额再返回给A)来解决这一问题。事务是把多个SQL打包成为一个整体,要么都执行,要么做到看起来都不执行的样子。
事务的特性:
- 原子性:保证一系列操作都能正确执行或者恢复如初
- 一致性:事务执行之前之后,数据都不能太离谱
- 持久性:事务做出的修改,都是在硬盘上持久保存的。服务器重启数据依然存在
- 隔离性:解决数据库处理并非事务中出现的问题
并发处理事务中的问题
1.“脏读”:指的是A正在写数据的过程,B在读取A的数据,随后A修改了数据,导致B之前读入的数据变成了无效数据。
2.重复读:指的是并发执行事务过程中,如果事务A在内部多次读取同一个数据的时候,出现不同的情况,这种情况就是不可重复读。简单说对一个事务不能出现两次读取是不同的事务
3.幻读:指的是一个事务A执行过程中两次读取并未发生数据内容的变化,但是结果集发生了变化(结果集中临时表多了或少了)
如何解决并发处理事务中的问题
- 解决脏读的方法就是通过对核心数据进行“写加锁”(写的时候不能读)
- 解决重复读的方法是“读枷锁”(读的时候不能写)
- 解决重幻读的方法是保证绝对的串行执行事务,此时完全没有并发
事务开启
start transaction;//开启事务后执行的每个sql都自成一个体系
事务结束
commit; //事务结束
主动触发回滚
rollback;//主动触发回滚,一般是要搭配一些逻辑条件进行使用