mysql索引以及事务简介

本文详细探讨了MyBatis的优缺点,包括其灵活性、代码量减少、数据库兼容性、与Spring集成、SQL编写挑战等。此外,深入讲解了MySQL索引原理、类型、创建、适用场景及限制,以及事务的ACID特性及其保证机制。
摘要由CSDN通过智能技术生成

一、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、索引类型及对

        普通索引:允许被索引的数据列包含重复的值。
        唯一索引:可以保证数据记录的唯一性。
        主键:是一种特殊的唯一索引,在一张表中只能定义一个主键索引,主键用于唯一标识一条记录,使用关键字 PRIMARY KEY 来创建。
        联合索引:索引可以覆盖多个数据列,如像INDEX(columnA, columnB) 索引。
        全文索引:通过建立 倒排索引 , 可以极大的提升检索效率 , 解决判断字段是否包含的问题,是目前搜索引擎使用的一种关键技术。可以通过ALTER TABLE table_name ADD FULLTEXT (column); 来 创建全文索引。

3、索引对数据库的性能的影响

        1.索引可以极大的提高数据的查询速度。
        2.通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
        3.但是会降低插入、删除、更新表的速度,因为在执行这些写操作时,还要操作索引文件。
        4.索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大,如果非聚集索引很多,一旦聚集索引改变,那么所有非聚集索引都会跟着变。

4、怎样创建一个索引

创建普通索引: CREATE INDEX 索引名 ON 表名 (列名) TABLESPACE 表空间名;

创建唯一索引: CREATE unique INDEX 索引名 ON 表名 (列名) TABLESPACE 表空间名;

创建联合索引: CREATE INDEX 索引名 ON 表名 (列名1,列名2) TABLESPACE 表空间名;

创建反向键索引: CREATE INDEX 索引名 ON 表名 (列名) reverse TABLESPACE 表空间名;

5、什么情况下不推荐使用索引

1.数据唯一性差(一个字段的取值只有几种时)的字段不要使用索引

比如性别,只有两种可能数据。意味着索引的二叉树级别少,多是平级。这样的二叉树查找无异于全表扫描。

2.频繁更新的字段不要使用索引

比如logincount登录次数,频繁变化导致索引也频繁变化,增大数据库工作量,降低效率。

3.字段不在where语句出现时不要添加索引,如果where后含IS NULL /IS NOT NULL/ like ‘%输入符%’等条件,不建议使用索引

只有在where语句出现,mysql才会去使用索引

4.where 子句里对索引列使用不等于(<>),使用索引效果一般

6、什么情况下索引失效

        1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引。

select * from tb1 where nid = 1 or name = 'seven@live.com';
  
 --特别的:当or条件中有未建立索引的列才失效,以下会走索引
select * from tb1 where nid = 1 or name = 'seven';
select * from tb1 where nid = 1 or name = 'seven@live.com' and email = 'alex'

        2.对于多列索引,查询条件中不使用这些字段中的第1个字段时,索引会失效

        3.like查询以%开头会导致索引失效

select * from tb1 where email like '%cn';

        4.列类型是字符串时一定要在条件中加上单引号,否则不使用索引

select * from tb1 where email = 999;

        5.如果mysql估计使用全表扫描要比使用索引快,则不使用索引

        6.普通索引的不等于(!=或者> <)会导致索引失效,直接全表扫描

- !=
 select * from tb1 where email != 'alex'
 
 --特别的:如果是主键,则还是会走索引
  select * from tb1 where nid != 123
- >
 select * from tb1 where email > 'alex'
 
 --特别的:如果是主键或索引是整数类型,则还是会走索引
  select * from tb1 where nid > 123
  select * from tb1 where num > 123

        7.组合索引遵循“最左前缀”原则

         如果组合索引为:(name,email),则如下

                name and email -- 使用索引

                name -- 使用索引

                email -- 不使用索引

        8.在索引列上进行操作(计算、函数、类型转换)会导致索引失效,而进行全表扫描

7、mysql聚簇和非聚簇索引的区别

        都是B+树的数据结构

  • 聚簇索引:将数据存储与索引放到了一块、并且是按照一定的顺序组织的,找到索引也就找到了数据,数据的物理存放顺序与索引顺序是一致的,即:只要索引是相邻的,那么对应的数据一定也是相邻地存放在磁盘上的
  • 非聚簇索引:叶子节点不存储数据、存储的是数据行地址,也就是说根据索引查找到数据行的位置再取磁盘查找数据。

8、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 恢复。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值