mysql
索引以及事务简介
一、mybatis的优缺点
优点:
1
、基于
SQL
语句编程,相当灵活,不会对应用程序或者
数据库的现有设计造成任何影响,
SQL
写在XML 里,解除
sql
与程序代码的耦合,便于统一管理;提供
XML
标签, 支持编写动态
SQL
语句, 并可重用。
2
、与
JDBC
相比,减少了
50%
以上的代码量,消除了
JDBC
大量冗余的代码,不需要手动开关连接;
3
、很好的与各种
数据库兼容( 因为
MyBatis
使用
JDBC
来连接数据库,所以只要
JDBC
支持的数据库MyBatis 都支持)。
4
、能够与
Spring
很好的集成;
5
、提供映射标签, 支持对象与数据库的
ORM
字段关系映射; 提供对象关系映射标签, 支持对象关系组件维护。
缺点:
1
、
SQL
语句的编写工作量较大, 尤其当字段多、关联表多时, 对开发人员编写
SQL
语句的功底有一定要求。
2
、
SQL
语句依赖于数据库, 导致数据库移植性差, 不能随意更换数据库。
二、MySql索引
1、索引的基本原理:
1. 把创建了索引的列的内容进行排序
2. 对排序结果生成倒排表
3. 在倒排表内容上拼上数据地址链
4. 在查询的时候,先拿到倒排表内容,再取出数据地址链,从而拿到具体数据
2、mysql中索引类型及对数据库的性能的影响
普通索引:允许被索引的数据列包含重复的值。
唯一索引:可以保证数据记录的唯一性。
主键:是一种特殊的唯一索引,在一张表中只能定义一个主键索引,主键用于唯一标识一条记录,使用关键字 PRIMARY KEY 来创建。
联合索引:索引可以覆盖多个数据列,如像INDEX(columnA, columnB)
索引。
全文索引:通过建立 倒排索引
,
可以极大的提升检索效率
,
解决判断字段是否包含的问题,是目前搜索引擎使用的一种关键技术。可以通过ALTER TABLE table_name ADD FULLTEXT (column); 来
创建全文索引。
索引对数据库的影响:
1.索引可以极大的提高数据的查询速度。
2.通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
3.但是会降低插入、删除、更新表的速度,因为在执行这些写 *** 作时,还要 *** 作索引文件。
4.索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大,如果非聚集索引很多,一旦聚集索引改变,那么所有非聚集索引都会跟着变。
3、mysql聚簇和非聚簇索引的区别
都是B+树的数据结构
- 聚簇索引:将数据存储与索引放到了一块、并且是按照一定的顺序组织的,找到索引也就找到了数据,数据的物理存放顺序与索引顺序是一致的,即:只要索引是相邻的,那么对应的数据一定也是相邻地存放在磁盘上的
- 非聚簇索引:叶子节点不存储数据、存储的是数据行地址,也就是说根据索引查找到数据行的位置再取磁盘查找数据。
4、mysql索引的数据结构,各自优劣
在MySQL
中使用较多的索引有
B+树索引,Hash
索引等,InnoDB存储引擎的默认索引实现为:B+
树索引。对于哈希索引来说,底层的数据结构就是哈希表,因此在绝大多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;其余大部分场景,建议选择BTree索引。
B+树:
B+树是一个平衡的多叉树,从根节点到每个叶子节点的高度差值不超过
1
,而且同层级的节点间有指针相互链接。在B+
树上的常规检索,从根节点到叶子节点的搜索效率基本相当,不会出现大幅波动,而且基于索引的顺序扫描时,也可以利用双向指针快速左右移动,效率非常高。因此,B+
树索引被广泛应用于数据库、文件系统等场景。
哈希索引:
哈希索引就是采用一定的哈希算法,把键值换算成新的哈希值,检索时不需要类似B+
树那样从根节点到叶子节点逐级查找,只需一次哈希算法即可立刻定位到相应的位置,速度非常快。
hash索引优缺点:
1.如果是等值查询,那么哈希索引明显有绝对优势,因为只需要经过一次算法即可找到相应的键值;前提是键值都是唯一的。如果键值不是唯一的,就需要先找到该键所在位置,然后再根据链表往后扫描,直到找到相应的数据;
2.如果是范围查询检索,这时候哈希索引就毫无用武之地了,因为原先是有序的键值,经过哈希算法后,有可能变成不连续的了,就没办法再利用索引完成范围查询检索;
3.哈希索引也没办法利用索引完成排序,以及like ‘xxx%’ 这样的部分模糊查询(这种部分模糊查询,其实本质上也是范围查询);
4.哈希索引也不支持多列联合索引的最左匹配规则;
5. B+
树索引的关键字检索效率比较平均,不像
B
树那样波动幅度大,在有大量重复键值情况下,哈希索引的效率也是极低的,因为存在哈希碰撞问题。
三、事务的基本特性和隔离级别
1、事务基本特性ACID分别是:
原子性:
指的是一个事务中的 *** 作要么全部成功,要么全部失败。
一致性:
指的是数据库总是从一个一致性的状态转换到另外一个一致性的状态。比如
A
转账给
B100
块钱, 假设A
只有
90
块,支付之前我们数据库里的数据都是符合约束的
,
但是如果事务执行成功了
,
我们的数据库数据就破坏约束了,
因此事务不能成功
,
这里我们说事务提供了一致性的保证
隔离性:
指的是一个事务的修改在最终提交前,对其他事务是不可见的。
持久性:
指的是一旦事务提交,所做的修改就会永久保存到数据库中。
2、ACID靠什么保证的?
A
原子性由
undo log
日志保证,它记录了需要回滚的日志信息,事务回滚时撤销已经执行成功的
sql
C
一致性由其他三大特性保证、程序代码要保证业务上的一致性
I
隔离性由MVCC(多版本并发控制)来保证
D
持久性由内存
+redo log
来保证,
mysql
修改数据同时在内存和
redo log
记录这次 *** 作,宕机的时候可以从redo log
恢复。
详细视频:
膜拜!华为大牛透彻讲解Java面试100道必考题,不管你工作几年,都得看看!现在免费分享给大家!_哔哩哔哩_bilibili
评论列表(0条)