【MySQL】索引和事物

news/2025/2/15 13:38:15/

目录

♫索引

♪什么是索引

♪索引的数据结构

♪索引的使用

 ♫事务

♪什么是事务

♪事务的特性

♪事务的使用


♫索引

♪什么是索引

索引是存储在磁盘上的一个数据结构,通过索引可以快速地定位到存储在磁盘上的数据。

索引在提高查询速度的同时,还提高了增删改(增删改的同时还需要额外调整索引)和空间的开销(构建索引需要额外的磁盘空间)。

♪索引的数据结构

索引的目的是为了加快查询速度,在我们已知的数据结构中,虽然哈希表查询的时间复杂度(O(1))最低,但哈希表并不能查询指定范围的数据,故并不适合构成MySQL里的索引而二叉搜索树虽然能查询指定范围,但由于是二叉,当数据量大时,树的高度就会比较高,元素之间的比较次数就多,读硬盘的次数也就会变多,从而速度就会降低,故也不是很适合构成MySQL里的索引。那MySQL里的索引底层到底是什么呢?其实它的底层是一种名叫B+树的数据结构。

B+树具有以下特点:

①.B+树是一颗N插搜索树,每个节点有N个key,N个key划分出N个区间,最后一个key为所在区间的最大值

②.父节点的key会在子节点中重复出现,并且是该子节点的最大值,这样叶子节点就包含所有数据的全集

③.叶子结点会以类似链表的形式互相连接

B+树由于是N叉搜索树,故高度会比二叉搜索树低,从而读取硬盘的次数就比较低;B+树的所有的查询都是落在叶子节点上,中间比较次数差不多,故查询操作比较均衡;由于B+数的叶子节点包含所有数据,故只需在叶子节点存放具体数据,非叶子节点只需存放索引值即可,这样极大节省了内存空间,就有可能将非叶子节点放进内存中缓存,进一步降低硬盘IO的次数。

♪索引的使用

♩查看索引
创建主键约束( PRIMARY KEY )、唯一约束( UNIQUE )、外键约束( FOREIGN KEY )时,会自动创建对应列的索引:
语法: show index from 表名;
mysql> create table student(id int primary key auto_increment, name varchar(20));
Query OK, 0 rows affected (0.06 sec)mysql> show index from student;
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table   | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| student |          0 | PRIMARY  |            1 | id          | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
1 row in set (0.01 sec)
♩创建索引
对于非主键、非唯一约束、非外键的字段,可以创建普通索引:
语法: create index 索引名 on 表名(列名);
mysql> create index idx_student_name on student(name);
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0mysql> show index from student;
+---------+------------+------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table   | Non_unique | Key_name         | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+---------+------------+------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| student |          0 | PRIMARY          |            1 | id          | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| student |          1 | idx_student_name |            1 | name        | A         |           0 |     NULL | NULL   | YES  | BTREE      |         |               |
+---------+------------+------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
2 rows in set (0.00 sec)

♩删除索引
语法: drop index 索引名 on 表名;
mysql> drop index idx_student_name on student;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0mysql> show index from student;
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table   | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| student |          0 | PRIMARY  |            1 | id          | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
1 row in set (0.00 sec)

注:

①.创建索引最好是在表创建之初执行,如果对已有大量数据的表创建索引会吃掉大量磁盘IO,花费很长时间

②.可以使用explain关键字显示出查询过程中具体的索引使用情况

③.每个索引列都有对应的B+树,对于非主键列的索引会先查询该索引列的B+树,再根据查询结果查询主键列的B+树

 ♫事务

♪什么是事务

事务是指在数据库中进行的一组相关的操作,被当作一个单独的工作单元处理,要么全部执行,要么全部回滚。

♪事务的特性

事务具有以下四个特性:

1. Atomicity(原子性):一个事务中的所有操作要么全部成功,要么全部失败,不能只执行其中部分操作。

2. Consistency(一致性):事务执行前后数据库的状态必须保持一致,也就是满足数据库的约束和规则。

3. Isolation(隔离性):当多个事务同时执行时,每个事务都应该被视为独立的,不能相互影响。每个事务必须独立执行,并发执行时不能出现干扰。

4. Durability(持久性):事务完成后,其所作的修改应该永久保存在数据库中,即使系统出现故障也不应该丢失。

♪事务的使用

MySQL中开启事务的语句为start transaction,提交事务的语句为commit,回滚事务的语句为rollback。事务的使用可以保证数据的一致性和完整性,避免数据损坏和丢失。

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)mysql> insert into student values(1,"张三");
Query OK, 1 row affected (0.02 sec)mysql> update student set name="李四" where name="张三";
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> commit;
Query OK, 0 rows affected (0.00 sec)

http://www.ppmy.cn/news/1152728.html

相关文章

[题] 前缀和 (含输入输出的耗时对比)

题目 前缀和 题解 前缀和模板 太简单了就多加了点东西:对比cin cout和scanf printf的耗时对比 代码 #include <iostream> using namespace std; const int N 100010; int n, m; int a[N], s[N]; int main(){scanf("%d%d", &n, &m);//原数组 for (in…

课题学习(七)----粘滑运动的动态算法

一、 粘滑运动的动态算法 在实际钻井过程中&#xff0c;钻柱会出现扭振和粘滑现象&#xff08;粘滑运动–B站视频连接&#xff09;&#xff0c;但并不总是呈现均匀旋转。如下图所示&#xff0c;提取一段地下数据时&#xff0c;转盘转速保持在100 r/min&#xff0c;钻头转速在0-…

【Android】关于touch设备TOOL_TYPE_STYLUS

这里通过log来查看触控笔的motionEvent&#xff0c; Overridepublic boolean onTouchEvent(MotionEvent event) {Log.i(tag, "event" event);return true;}Overridepublic boolean onGenericMotionEvent(MotionEvent event) {Log.i(tag, "G event" event…

命令行启动android模拟器

有时候不想打开android studio就能方便的启动模拟器&#xff0c;探索一番后发现可以通过命令行来启动&#xff0c;方便快捷。 环境准备 首先安装好android studio&#xff0c;android sdk&#xff0c;从android studio中安装好模拟器。 命令启动 如果直接在终端输入emulato…

(C语言进阶)笔试题详解

一.要点回顾 1.一维整形数组 (1)sizeof()对一维整形数组的应用 #include<stdio.h> int main() {int a[] {1,2,3,4};printf("%d\n", sizeof(a));//16 //sizeof(数组名),数组名表示整个数组&#xff0c;计算的是整个数组的大小&#xff0c;单位是字节printf…

LCR 172.统计目标成绩的出现次数

​​题目来源&#xff1a; leetcode题目&#xff0c;网址&#xff1a;LCR 172. 统计目标成绩的出现次数 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 两次二分&#xff0c;一次寻找首次出现的位置&#xff0c;一次寻找最后一次出现的位置。 解题代码&#…

SAP报错CX_SY DYN CALL PARAM MISSING

DYN CALL METH PARAM MISSING CX_SY DYN CALL PARAM MISSING 在 ABAP 中&#xff0c;当你定义一个方法时&#xff0c;可以选择将方法的参数标记为可选&#xff08;可选参数&#xff09;或必需&#xff08;必需参数&#xff09;。如果你不勾选可选参数选项&#xff0c;那么该参…

在网络安全、爬虫和HTTP协议中的重要性和应用

1. Socks5代理&#xff1a;保障多协议安全传输 Socks5代理是一种功能强大的代理协议&#xff0c;支持多种网络协议&#xff0c;包括HTTP、HTTPS和FTP。相比之下&#xff0c;Socks5代理提供了更高的安全性和功能性&#xff0c;包括&#xff1a; 多协议支持&#xff1a; Socks5代…