目录
1、索引
1.1 查看索引
1.2 创建索引
1.3 删除索引
1.4 索引的实现
2、事务
1、索引
索引等同于目录,属于针对查询操作的一个优化手段,可以通过索引来加快查询的速度,避免针对表进行遍历。
主键、unique和外键都是会自动生成索引的。
索引能提高查询的速度,但也是有代价的。
1、占用更多的空间,生成索引是需要一系列的数据结构,以及一系列的额外的数据来存储到硬盘空间。
2、可能会降低插入、修改、删除的速度。
1.1 查看索引
使用 show index from 表名; 来查看索引
例如:
1.2 创建索引
使用 create index 索引名 on 表名(列名); 来创建索引
例如:
注意:
创建索引时,如果表中的数据很多,创建索引容易使服务器卡住,就需要另一台机器,在MySQL中部署相同的表,创建所需要的索引,然后导入数据替换。
1.3 删除索引
使用 drop index 索引名 on 表名;来删除索引
自己创建的索引可以删除,如果是自动创建的索引,不能删除。
例如:
1.4 索引的实现
索引也是通过一定的数据结构实现的,MySQL的索引是一个改进的树形结构 B+树(N叉搜索树)。
B树
B树是通过区间来进行分支的,每个节点的度都是不确定的,一个节点保存N个key,就可以划分出N+1个区间,每个区间都可以衍生一系列的子树。
一个节点中,虽然可以保存N个key,但不是无限制的,达到一定的规模,就会触发节点的分裂,当删除元素达到一定的数目,也会触发节点的合并。
B树(N叉搜索树)
特点:
1、每个节点上有M个key,划分出M+1个区间。
2、进行查询的时候,根据根节点出发,判定当前要查的数据在节点的哪个区间内,再决定下一步往哪走。
3、进行添加和删除元素时,可以涉及到节点的拆分和合并。
B+树
B+树的特点:
1、B+树也是一个N叉搜索树,一个节点上存在N个key,就划分成N个区间。
2、每个节点上N个key中,最后一个就相当于当前子树的最大值。
3、父节点上的每个key都会以最大值的身份在子节点的对应区间中存在,叶子节点这一层,包含整个树的数据全集。
4、B+树会使用链表这样的结构,把叶子节点串起来,此时就可以非常方便的完成数据集合的遍历,并且方便的从数据中按照范围取出一个“子集”。
优点:
1、N叉搜索树,树的高度是有限的。
2、非常擅长范围查询
3、所有的查询都是落在叶子节点上,查询之间的开销是稳定的。
4、由于叶子节点是全集,会把数据只存储在叶子节点上,非叶子节点只存储一个用来排序的key,所以非叶子节点用不了多少空间,就可以缓存在内存中,提升访问的速度。
2、事务
事务可以把多个SQL语句打包成一个整体,可以保证这些SQL语句要么全部执行,要么一个都不执行,具有原子性的特点。
事务的执行过程:
开始事务:start transaction;
执行各种SQL语句
主动触发回滚:rollback;
事务结束:commit;
事务的原理:
回滚:以日志的方式,记录事务中的关键操作,这样的记录是回滚的依据。然后以打印的方式,将内容放在文件中,即使主机掉电,也不会影响,一旦启动主机,MySQL也会重新启动,发生回滚操作。
事务的特点:
1、原子性:回滚的方式,保证操作都能执行正确。
2、一致性:事务执行前后,数据不能产生特别大的差异。
3、持久性:事务做出的修改,都是在硬盘上持久保存的,重启服务器,修改仍然有效。
4、隔离性:数据并发执行多个事务时,并发程度越高,整体的效率就越高。
提高并发执行的程度,对提高效率,但也会产生一些问题。
1、脏读问题
一个事务A正在写数据的过程中,另一个事务B读取了同一个数据,接下来事务A修改了数据,导致事务B读到的数据是一个无效数据。
解决方法:
针对写加锁,等写的操作完全执行结束,并且不再修改之后再读,并发性降低了,隔离性提高了,效率降低了,准确性提高了。
2、不可重复读
并发执行事务的过程中,如果事务A多次读取同一个数据,出现不同的情况,就是不可重复读,事务A再读的过程中,事务B修改了数据并提交了数据。
解决方法:
针对读操作进行加锁,读的时候不能再修改数据。
3、幻读
一个事务A执行的过程中,两次读取操作,数据内容没有改变,但是结果集变了,就称为“幻读”。
解决方法:
保持决定的串行执行事务,完全没有并发,效率最低,隔离最高,内容最准确。