MySQL索引、事务

一、Mysql索引介绍

        索引是一个排序的列表,里面存放了索引的值和包含这个值的数据所在行的物理地址。在数据十分庞大的时候,使用索引就可以加快查询的效率,就像书籍的目录一样。

        当数据保存在磁盘类存储介质上时,作为一个整体数据块存放,以保持操作的原子性,这种存储结构类似于链表。

        若不使用索引进行查询,则时间复杂度为N/2;而对于一个有序的字段,就可以使用二分查找,时间消耗为log2(N)。N表示数据块的个数。但是索引也有自己的缺点,因为在一个表中为字段创建一个索引,将创建另一个数据结构,包含字段数值和指向相关记录的指针,这代表它需要额外的存储空间。

1.1 索引的作用

        假设有三个为索引的表t1、t2、t3,分别只包含c1、c2、c3,每个表分别含有1000行数据组成,均为1~1000的数值,查找对应值相等行的查询如下所示:

mysql>select c1,c2,c3 from t1,t2,t3 where c1=c2 and c1=c3;

在没有索引的情况下会将用t1中的每行与t2中的每行数据进行匹配,与t3执行同样的匹配,若已知没找到匹配的结果,就会执行1000*1000*1000此查询结果。 

        如果对每个表进行索引,就能极大地加快查询速度,利用索引的查询处理如下:

  • 从表t1中选择第一行,查看此行所包含的数据。
  • 使用表t2上的索引,直接定位t2中于t1的值匹配的行。t3同理。
  • 扫描表t1的下一行并重复前面的过程,直到遍历t1中的所有行。

1.2 索引的分类

        可以从两个角度来划分:从物理存储角度,索引分为聚簇索引和非聚簇索引,聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索更快。

        从逻辑的角度划分,索引分为普通索引、唯一索引、主键索引、组合索引和全文索引。

        1.2.1 普通索引

        最基本、默认的索引方式,没有任何限制,主要的创建方式有:

        ①直接创建:

mysql>create index 索引名称 on 表名(索引字段名(字段长度));

        ②修改表结构的创建:

mysql>alter table 表名 add index 索引名 (索引字段名(字段长度));

        ③创建表结构同时创建索引:

mysql>create table 表名(字段名1 数据类型(字段1的长度),字段名2 数据类型(字段2的长度) index 索引名 (索引字段名(长度));

        1.2.2 唯一索引

        与普通索引类似,但是索引的字段中不能有重复的值,但允许有空值(只能有一个)。如果在组合索引中创建唯一索引,则组合索引中的多个字段(例如A、B、C字段),这ABC字段包含的行中不能有一摸一样的行。唯一索引的创建方法和普通索引类似:

        ①直接创建:

mysql>create unique index 索引名 on 表名(索引字段名(长度));

        ②修改表结构的创建:

mysql>alter table 表名 add unique index 索引名 (索引字段名(字段长度));

        ③创建表结构同时创建索引:

 mysql>create table 表名(字段名1 数据类型(字段1的长度),字段名2 数据类型(字段2的长度) index 索引名 (索引字段名(长度));

        1.2.3 主键索引

        主键索引是一中特殊的唯一索引,一个表只能有一个主键,不允许有空值,一般是在建表的时候同时创建主键索引:

mysql>create table 表名 (字段名1 数据类型(字段1的长度),字段名2 数据类型(字段2的长度) primary key (主键字段名));

        1.2.4 组合索引

         有时在查询时,需要指定多个字段作为限制条件。可以通过同时给多个字段创建索引来提高查询效率,注意单独给每个字段创建索引并在使用时使用多个有索引的字段并不是组合索引。组合索引的创建语法为:

mysql>create table 表名(字段名1 数据类型(字段长度),字段名2 数据类型(字段长度)……index 表名(字段1,字段2……));

         使用select查询时,使用的where条件是以此从左到右执行,若使用的组合索引,注意where后面填写的字段要和创建组合索引是设置的字段顺序一致,否则索引无法生效。

        1.2.5 全文索引

        ①直接创建:

mysql>create fulltext index 索引名 on 表名(表中的字段名);

        ②修改表结构的创建:

mysql>alter table 表名 add fulltext index 索引名(表中的字段名);

        ③创建表结构同时创建索引:

mysql>create table 表名(字段名1 数据类型(字段长度),字段名2 数据类型(字段长度)…… fulltext (字段名));

1.3 创建索引的原则依据

        1.3.1 数据库建立索引的原则

        适合建立索引的场景:

  •  字段中的值不会频繁修改。
  • 经常被用作查询条件(经常出现在where中)的字段。
  • 表中数据量较多的表(以300行为准)。
  • 经常与其他表连接的表里的用于连接字段需要创建索引。
  • 在sql语句中经常进行group by、order by的字段。
  • 表中的主键和外键。
  • 在经常存取的多个字段上建立组合索引

        不适合建立索引的场景:

  • 表中频繁改动的字段。
  • 表中数量较少的表。
  • 字段的数据类型为大型数据类型的字段。
  • 不同值较少的字段。

1.5 查看索引

        查看索引的方法有两种:

mysql>show index from 表名;

msyql>show keys from 表名; 

        在显示的信息中会显示这个索引的数据结构,包含:
 

Table表的名称
Non_unique如果索引不能包括重复词,则为0;如果可以,则为1。
Key_name索引的名称。
Seq_in_index索引中的列序号,从1开始。
Column_name字段名称。
Collation字段以什么方式存储在索引中。在 MySQL 中,有值A(升序)或 NULL(无分类)。

Cardinality

索引中唯一值数目的估计值。通过运行 analyze table 或 myisamchk -a可以更新。基数根据被存储为整数的统计数据来计数,所以即使对于小型表,该值也没有必要是精确的。基数越大,当进行联合时,MSQL使用该索引的机会就越大。
Sub_part如果字段只是被部分地编入索引,则为被编入索引的字符的数目。如果整个字段被编入索引,则为 NULL。

Packed

只是关键字如何被压缩,如果没有被压缩,则为NULL.
Null如果字段里的值含有 NULL,则含有YES。如果没有,则该字段含有NO.
Index_type用过的索引方法(btree,fulltext,hash,rtree)。
Comment备注。

1.6 删除索引

        索引也会占用一定的磁盘空间,因此需要删除一些无用的索引。删除的方法有两种:

mysql>drop index 索引名 on 表名;

mysql>alter table 表名 drop index 索引名; 

二、MySQL事务

        mysql事务主要用于处理操作量大,复杂度高的数据。比方说删除一个员工的信息,既要删除他的基本资料,与其相关的信息,任职的部门等信息,这样删除员工的信息的这一整个过程就是一个事务。

  • 在mysql中只有使用了innodb数据库引擎的数据库或表才支持事务。
  • 事务处理可以用来维护数据库的完整性,保证成批的SQL语句要么完全执行成功,要么不执行。
  • 事务用来管理insert、update、delete语句。

        事务必须满足4个条件:

  • 原子性:一个事务的执行只会成功或不执行,若在执行过程中出现错误,系统就会回滚到事务开始前的状态。
  • 一致性:事务执行前和执行后,数据库的完整性没有被破坏,这表示写入的资料必须完全符合所有的预设规则。
  • 隔离性:数据库允许多个事务并发执行,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离级别包括读未提交(Read uncommit)、读提交(read committed)、可重复读(repeatable read)、串行化(Serializable);
  • 持久性:事务处理结束后,对数据的修改就是永久的,即使系统故障也不丢失。

        因为mysql命令行的默认设置事务自动提交。因此要显式的开启一个事务必须使用命令begin或start transaction,或者在主配置文件中添加“set autocommit=0”,禁止自动提交当前会话。

        事务控制语句包含:

begin或start transaction显式地开启一个事务
commit或commit workcommit会提交事务,并使已对数据库进行的修改变为永久性。
rollback或rollback work会结束用户的事务,并撤销正在进行的所有未提交的修改。
savepoint 标识符允许在事务中创建一个保存点,一个事务可以有多个保存点
release savepoint 标识符删除事务中的一个保存点
rollback to 标识符把事务回滚到标记点
set transaction用于设置事务的隔离级别。

         mysql事务处理主要有两种方法:
        ①用begin,rollback,commit来实现

语法:
mysql>begin;

mysql>SQL语句;

mysql>commit;

#以上就是一个事务的处理

        ②直接用set改变MySQL的自动提交模式,在配置文件中修改set autocommit的值即可,1为开启自动提交,0不开启。 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS Next开发学习手册——内存管理(GC)

GC(全称 Garbage Collection),即垃圾回收。在计算机领域,GC就是找到内存中的垃圾,释放和回收内存空间。当前主流编程语言实现的GC算法主要分为两大类:引用计数和对象追踪(即Tracing GC&#xff…

【系统架构设计师】计算机组成与体系结构 ③ ( 层次化存储结构 | 寄存器 | 高速缓存 | 内存 | 外存 )

文章目录 一、层次化存储结构1、层次化存储结构2、层次化存储结构 - 示例说明3、程序员可操作的部分 计算机 采用 分级存储结构 , 主要目的是 为了 解决 容量 / 价格 / 速度 之间的矛盾 ; 一、层次化存储结构 1、层次化存储结构 计算机 存储器 按照存储速度 由快到慢 进行排序 …

算法入门:二分查找及其Java实现

在程序开发中,算法是解决问题的核心。本篇博客将详细讲解一种高效的查找算法——二分查找,并通过Java代码示例帮助你理解其实现和应用。 如果你觉得这篇文章对你有帮助,不要忘记点赞、收藏和关注我,这将是对我最大的支持和鼓励&am…

2、数据库模型图、er图

关系 user和administarators是多对一的关系 user和order是一对多的关系 shipped和order是多对一的关系 order和books是多对多的关系 leavewords和order是一对一的关系 stock和books是一对多的关系 Chens 数据库表示法——ER图 Crows Foot数据库表示法——数据库模型图 Navicat表…

%运算符

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法介绍 在python中,可以使用%运算符进行灵活多样的格式化处理,通用的语法格式为: (格式模板&…

9.二维数组的遍历和存储

二维数组的遍历和存储 二维数组的遍历 二维数组a[3][4],可分解为三个一维数组,其数组名分别为: 这三个一维数组都有4个元素,例如:一维数组a[0]的 元素为a[0][0],a[0][1],a[0][2],a[0][3]。所以遍历二维数组无非就是先取出二维数组中得一维数组, 然后再从一维数组中取出每个元…

关于摄像头模组中滤光片的介绍

1、问题背景 红外截止滤光片(IR CUT Filter)是应用在摄像头模组中非常重要的一个器件,因人眼与 coms sensor 对光线各波长的响应不同, 人眼看不到红外光,但 sensor 能感应到(如下图是某sensor在各波长下的…

Docker之jekins的安装

jekins官网地址:Jenkins Plugins (https://plugins.jenkins.io/) jekins 的docker 官方地址:https://hub.docker.com/r/jenkins/jenkins jekins 的docker 允许命令文档地址: docker/README.md at master jenkinsci…

40岁学习java是否需要报班学习?

在开始前刚好我有一些资料,是我根据网友给的问题精心整理了一份「java的资料从专业入门到高级教程」, 点个关注在评论区回复“666”之后私信回复“666”,全部无偿共享给大家!!!应该不需要。各种公开免费的…

CS-隐藏防朔源-数据转发-中间件反向代理-Apache

目录 1、代理机安装Apache: 2、中间件设置转发: 添加代理 3、重启Apache服务 4、CS监听器配置转发机IP 实战情况下还是要准备两台外网服务器. --还是做个中转 1、代理机安装Apache: apt-get install apache2 a2enmod proxy proxy_ajp proxy_balancer proxy_co…

用友 U8+ 控制金额、单价等字段权限设置

进入路径 系统服务——权限——数据权限控制设置 本功能是数据权限设置的前提,用户可以根据需要先在数据权限控制设置中选择需要进行权限控制的对象。 数据权限的控制分为记录级和字段级两个层次,对应系统中的两个页签"记录级"和"字段…

配置Nginx二级域名

一、环境 (一)配置 1.服务器 linux CentOS 2.反向代理 Nginx 3.开放端口 云服务器开放端口80和443 二、域名备案 (一)腾讯云 1.腾讯云域名备案流程 备注:一级域名备案后,二级域名可以不用再备案&a…

Construct公司 从 0 到 1 基于 Kitex+Istio 的微服务系统建设

本文根据 2024 年 5 月 25 日在上海举办的“云原生✖️AI 时代的微服务架构与技术实践”CloudWeGo 技术沙龙上海站活动中,Construct 服务端总监 Jason 的演讲《从 0 到 1 基于 Kitex Istio 的微服务系统建设》整理而来。 在微服务架构的浪潮中,企业面临…

BioCLIP:物种图像的基础视觉模型

从无人机到个人手机,各种相机收集的自然世界图像是越来越丰富的生物信息来源。从图像中提取生物相关信息用于科学的计算方法和工具激增,尤其是计算机视觉。然而,其中大多数都是为特定任务设计的,不容易适应或扩展到新的问题、环境…

Java-方法引用

方法引用概念 把已经有的方法拿过来用,当做函数式接口中抽象方法的方法体 前提条件 1、引用处必须是函数式接口 2、被引用的方法必须已经存在 3、被引用方法的形参和返回值 需要跟抽象方法保持一致 4、被引用方法的功能要满足当前需求 方法引用格式示例 方…

JavaScript高级程序设计(第四版)--学习记录之基本引用类型

Date Date类型将日期保存为自协调世界时间1970年1月1日午夜至今所经过的毫秒数。 创建日期对象 let now new Date() Date.parse()方法接收一个表示日期的字符串参数,尝试将这个字符串转换为表示该日期的毫秒数。 let time new Date(Date.parse("May 24,2024&…

Spring Boot 3 整合 SpringDoc OpenAPI 生成接口文档

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…

MySQL锁和使用

在MySQL中,锁用于控制并发访问,以保证数据的一致性和完整性。MySQL提供了多种类型的锁,包括表级锁、行级锁和页面级锁。以下是MySQL中各种锁的详细介绍及其使用方法: 1. 表级锁(Table Locks) 表级锁用于锁…

Studying-代码随想录训练营day22| 回溯理论基础、77.组合、216.组合总和II、17.电话号码的字母组合

第22天,回溯章节开始!一大算法难点,加油加油! 回溯理论基础组合问题的剪枝操作 文档讲解:代码随想录回溯理论基础 视频讲解:回溯理论基础 回溯法也叫回溯搜索法,它是一种搜索,遍历的…

Python 算法交易实验73 QTV200第二步: 数据清洗并写入ClickHouse

说明 先检查一下昨天启动的worker是否正常工作,然后做一些简单的清洗,存入clickhouse。 内容 1 检查数据 from Basefuncs import * # 将一般字符串转为UCS 名称 def dt_str2ucs_blockname(some_dt_str):some_dt_str1 some_dt_str.replace(-,.).re…