MySQL 索引和事务

目录

  • 1 索引
    • 1.1 简介
    • 1.2 使用
    • 1.3 示例
  • 2 事务
    • 2.1 简介
    • 2.2 使用

1 索引

1.1 简介

索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引,并指定索引的类型,各类索引有各自的数据结构实现。
索引底层是一棵B+树,也就是一棵特殊的二叉搜索树。
作用:

  1. 数据库中的表、数据、索引之间的关系,类似于书架上的图书、书籍内容和书籍目录的关系。
  2. 索引所起的作用类似书籍目录,可用于快速定位、检索数据。
  3. 索引对于提高数据库的性能有很大的帮助。
    在这里插入图片描述
    使用场景: 要考虑对数据库表的某列或某几列创建索引,需要考虑以下几点:
    (1)数据量较大,且经常对这些列进行条件查询。
    (2)该数据库表的插入操作,及对这些列的修改操作频率较低。
    (3)索引会占用额外的磁盘空间。
    满足以上条件时,考虑对表中的这些字段创建索引,以提高查询效率。反之,如果非条件查询列,或经常做插入、修改操作,或磁盘空间不足时,不考虑创建索引。

1.2 使用

创建主键约束(PRIMARY KEY)、唯一约束(UNIQUE)、外键约束(FOREIGN KEY)时,会自动创建对应列的索引。

  1. 查看索引:
    show index from表名;
    示例:查看学生表已有的索引:show index from student;
  2. 创建索引:
    对于非主键、非唯一约束、非外键的字段,可以创建普通索引:
    create index 索引名 on 表名(字段名);
    示例:创建班级表中,name字段的索引:create index idx_classes_name on classes(name);
  3. 删除索引:
    drop index 索引名 on 表名;
    示例:删除班级表中name字段的索引:drop index idx_classes_name on classes;

1.3 示例

准备测试表:

-- 创建用户表
DROP TABLE IF EXISTS test_user;
CREATE TABLE test_user (id_number INT,name VARCHAR(20) comment '姓名',age INT comment '年龄',create_time timestamp comment '创建日期'
)

准备测试数据: 批量插入用户数据(操作耗时较长,约在1小时+),这里用的是一个脚本文件来插入数据,大家直接使用即可:

-- 构建一个8000000条记录的数据
-- 构建的海量表数据需要有差异性,所以使用存储过程来创建,拷贝下面代码就可以了
drop function if exists rand_name;
delimiter $$
create function rand_name(n INT, l INT)
returns varchar(255)
begindeclare return_str varchar(255) default '';declare i int default 0;while i < n do if i=0 thenset return_str = rand_string(l);elseset return_str =concat(return_str,concat(' ', rand_string(l)));end if;set i = i + 1;end while;return return_str;end $$
delimiter ;-- 产生随机字符串
drop function if exists rand_string;
delimiter $$
create function rand_string(n INT)
returns varchar(255)
begindeclare lower_str varchar(100) default'abcdefghijklmnopqrstuvwxyz';declare upper_str varchar(100) default'ABCDEFJHIJKLMNOPQRSTUVWXYZ';declare return_str varchar(255) default '';declare i int default 0;declare tmp int default 5+rand_num(n);while i < tmp do if i=0 thenset return_str 
=concat(return_str,substring(upper_str,floor(1+rand()*26),1));elseset return_str 
=concat(return_str,substring(lower_str,floor(1+rand()*26),1));end if;set i = i + 1;end while;return return_str;end $$
delimiter ;-- 产生随机数字
drop function if exists rand_num;delimiter $$
create function rand_num(n int)
returns int(5)
begindeclare i int default 0;set i = floor(rand()*n);return i;
end $$
delimiter ;-- 向用户表批量添加数据
drop procedure if exists insert_user;
delimiter $$
create procedure insert_user(in start int(10),in max_num int(10))begin
declare i int default 0; set autocommit = 0;   
repeatset i = i + 1;insert into test_user values ((start+i) ,rand_name(2, 
5),rand_num(120),CURRENT_TIMESTAMP);until i = max_numend repeat;commit;
end $$
delimiter ;-- 执行存储过程,添加8000000条用户记录
call insert_user(1, 8000000);

查询 id_number 为112233的用户信息:
select * from test_user where id_number=556677;
可以看到耗时x.xx秒,这还是在本机一个人来操作,在实际项目中,如果放在公网中,假如同时有1000个人并发查询,那很可能就死机。
为提供查询速度,创建 id_number 字段的索引: create index idx_test_user_id_number on test_user(id_number);
换一个id_number查询,并比较执行时间: select * from test_user where id_number=446655;
可以看到查询速度很快,因此数据量较大时,用索引可以很快的查询数据,提高查询效率。

2 事务

2.1 简介

事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。
准备测试表:

droptable if exists accout;
createtable accout(id int primary key auto_increment,    name varchar(20) comment '账户名称',    money decimal(11,2) comment '金额'
);insertinto accout(name, money) values ('阿里巴巴', 5000),
('四十大盗', 1000);

比如说,四十大盗把从阿里巴巴的账户上偷盗了2000元:

-- 阿里巴巴账户减少2000
update accout set money=money-2000where name = '阿里巴巴';-- 四十大盗账户增加2000
update accout set money=money+2000where name = '四十大盗';

假如在执行以上第一句SQL时,出现网络错误,或是数据库挂掉了,阿里巴巴的账户会减少2000,但是四十大盗的账户上就没有了增加的金额。
解决方案: 使用事务来控制,保证以上两句SQL要么全部执行成功,要么全部执行失败。

2.2 使用

  1. 开启事务:
    start transaction;
  2. 执行多条SQL语句
  3. 回滚或提交:
    rollback/commit;
    说明:rollback即是全部失败,commit即是全部成功。

示例:

start transaction;
-- 阿里巴巴账户减少2000
update accout set money=money-2000where name = '阿里巴巴';
-- 四十大盗账户增加2000
update accout set money=money+2000where name = '四十大盗';
commit;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/450316.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows、Linux、Mac数据库的安装(mysql、MongoDB、Redis)

数据库的安装 作为数据存储的重要部分&#xff0c;数据库同样是必不可少的&#xff0c;数据库可以分为关系型数据库和非关系型数据库。 关系型数据库如 SQLite、MySQL、Oracle、SQL Server、DB2 等&#xff0c;其数据库是以表的形式存储&#xff1b;非关系型数据库如 MongoDB…

flutter开发实战-Camera自定义相机拍照功能实现

flutter开发实战-Camera自定义相机拍照功能实现 一、前言 在项目中使用image_picker插件时候&#xff0c;在android设备上使用无法默认设置前置摄像头&#xff08;暂时不清楚什么原因&#xff09;&#xff0c;由于项目默认需要使用前置摄像头&#xff0c;所以最终采用自定义…

stack_queue:三个关键注意事项解析

一、stack与容器 template<class T, class Container> class stack { private:Container _con; };Container 为容器&#xff0c;在实例化创建对象时&#xff0c;我们可以传 vector<T> 或 list<T> 等作为栈的底层。 举例&#xff1a; int main() {stack<i…

《苍穹外卖》知识梳理P1-多模块项目的创建

《苍穹外卖》知识梳理P1 一.多模块项目的创建 个人认为对于一个项目的学习&#xff0c;应当先从它的项目结构入手&#xff0c;明确了各个模块的职责与功能&#xff0c;后边尽心编写以及改写的时候会更加得心应手。 该项目分为了3个模块&#xff1a;sky-common模块&#xff0…

西瓜书学习笔记——核化线性降维(公式推导+举例应用)

文章目录 算法介绍实验分析 算法介绍 核化线性降维是一种使用核方法&#xff08;Kernel Methods&#xff09;来进行降维的技术。在传统的线性降维方法中&#xff0c;例如主成分分析&#xff08;PCA&#xff09;和线性判别分析&#xff08;LDA&#xff09;&#xff0c;数据被映…

【备战蓝桥杯】——循环结构终篇

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-yl4Tqejg4LkjZLAM {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

云尘 -- 铁三域控

描述&#xff1a; flag1 直接fscan开扫 发现存活两台机子123和141&#xff0c;其中141这台机子扫出来有ms17-010漏洞 继续信息收集&#xff0c;用nmap扫一波全端口&#xff0c;看看有没有遗漏 141这台机子一开始没扫到&#xff0c;看着提示使用-Pn再扫一遍就行了。因为如果当…

如何回答消息确认不丢失

1、如何知道有消息丢失&#xff1f; 2、哪些环节可能d 3、如何确保消息不丢失 二、消息丢失的环节 三&#xff0c;防止消息丢失的阶段操作 消息生产阶段 消息存储阶段 消息消费阶段 如何解决消息积压的问题 从消费端解决问题&#xff1a;

Leetcode—203. 移除链表元素【简单】

2024每日刷题&#xff08;一零九&#xff09; Leetcode—203. 移除链表元素 实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(n…

BUUCTF-Real-[struts2]s2-013

struts2的标签中 <s:a> 和 <s:url> 都有一个 includeParams 属性&#xff0c;可以设置成如下值none - URL中不包含任何参数&#xff08;默认&#xff09; get - 仅包含URL中的GET参数 all - 在URL中包含GET和POST参数 当includeParamsall的时候&#xff0c;会将本次…

力扣刷题之旅:启程篇(二)

力扣&#xff08;LeetCode&#xff09;是一个在线编程平台&#xff0c;主要用于帮助程序员提升算法和数据结构方面的能力。以下是一些力扣上的入门题目&#xff0c;以及它们的解题代码。 --点击进入刷题地址 1.最后得到的余数 题目描述&#xff1a; 给定两个非空字符串 nu…

六大免费的Redis内存分析工具

在我们需要分析Redis实例的内存使用情况时&#xff0c;市场上有着许多免费的开源工具&#xff0c;同时也有少量的付费产品。如果您想更深层次地分析内存相关问题的话&#xff0c;就可能需要用到一些更具针对性的“独门”工具了。 【51CTO.com快译】在我们需要分析Redis实例的内…