第9步---MySQL的索引和存储引擎

第9步---MySQL的索引和存储引擎

 1.索引

1.1分类

索引可以快速的找出具有特定值的行。不用从头开始进行寻找了。

类别

  • hash和b+tree

hash

  • 根据字段值生生成一个hash的值

  • 快速的进行定位到对应的行的值

  • 可能会出现相同的值,找到对应的空间会出现对应的值

b+tree树

  • 基于树的结构

  • 左边的数据都是比较大的

  • 中间的是相似的大小的数据

  • 最右边的是比较大的数据

类型

  • 单列:普通 唯一和主键

  • 组合

  • 全文

  • 空间

1.2索引操作

基本语法

 index 索引名字(要添加索引名称的列) -- 给name列创建索引

创建的方法

三种方式

  • 创建表的时候

  • 直接创建

  • 修改表的方式

创建表的时候进行指定
​
-- ========================索引相关操作=================
​
-- 方式1-创建表的时候直接指定
DROP TABLE IF EXISTS student;
create  table student(sid int primary key,card_id varchar(20),name varchar(20),gender varchar(20),age int,birth date, phone_num varchar(20),score double,index index_name(name) -- 给name列创建索引
);
​

刚刚创建的是普通的normal的索引的类型,创建的数据结构是btree。

之后查询指定索引的时候才是会有效的。而且数据量需要达到一定的规模不然也是不行的,速度变化不是很大的。

-- 直接创建的方式
CREATE INDEX index_gender ON student (gender);-- 修改表结构的方式
​
ALTER TABLE student add index index_age(age);
​

1.3查看索引

-- 1、查看数据库所有索引 
-- select * from mysql.`innodb_index_stats` a where a.`database_name` = '数据库名’; 
select * from mysql.`innodb_index_stats` a where a.`database_name` = 'xx';-- 2、查看表中所有索引 
-- select * from mysql.`innodb_index_stats` a where a.`database_name` = '数据库名' and a.table_name like '%表名%’; 
select * from mysql.`innodb_index_stats` a where a.`database_name` = 'xx' and a.table_name like '%student%';-- 3、查看表中所有索引 
-- show index from table_name; 
show index from student;

最后一个就可以了。前两个是比较详细的数据的信息了。  

1.4删除索引

-- 删除索引
drop INDEX 索引名字 ON 表名;
alter table student drop index index_age; drop INDEX index_gender ON student;

1.5唯一索引

创建表的时候创建唯一索引

直接创建唯一索引

修改表的时候创建唯一索引

-- 方式1-创建表的时候直接指定
create  table student2(sid int primary key,card_id varchar(20),name varchar(20),gender varchar(20),age int,birth date, phone_num varchar(20),score double,unique index_card_id(card_id) -- 给card_id列创建索引
);

-- 方式2-直接创建
-- create unique index 索引名 on 表名(列名) 
create  table student3(sid int primary key,card_id varchar(20),name varchar(20),gender varchar(20),age int,birth date, phone_num varchar(20),score double
);
create unique index index_card_id on student3(card_id);
-- 方式3-修改表结构(添加索引)
-- alter table 表名 add unique [索引名] (列名)
create  table student4(sid int primary key,card_id varchar(20),name varchar(20),gender varchar(20),age int,birth date, phone_num varchar(20),score double
);
alter table student4 add unique index_phone_num(phone_num);

 删除索引

-- 操作-删除索引drop index 索引名 on 表名; alter table 表名 drop index 索引名; 

1.6主键索引

在设置完主键进行创建表的时候会自动进行创建不需要单独进行指定索引。

1.7组合索引

针对的是对多个字段进行索引的设置的情况

-- 创建复合索引
-- 跟顺序是有关的
CREATE INDEX index_phone_number_name on  (phone_num,name);

 删除组合索引

drop index  index_phone_number_name on student  ;

创建一个组合唯一索引

-- 创建唯一索引两列的值不能相同
CREATE UNIQUE INDEX index_phone_number_name on  student(phone_num,name);

当出现下面的第4种的情况的时候是不行的是会出现错误的。

 什么时候可以用到索引呢?

组合索引是有原则的,最多优先的原则,尽量多的才能进行识别的。而且还遵循一个最左原则。

1.8全文索引

相似度的长度。数据量大的时候是比较好的。比全文检索的是快的。

不同的存储引擎对搜索引擎的支持是不同的。

最小搜索长度和最大搜索长度。

show variables like '%ft%';

 可以在my.ini文件夹下进行设置。

1.9全文检索的操作

create table t_article (id int primary key auto_increment ,title varchar(255) ,content varchar(1000) ,writing_date date -- , -- fulltext (content) -- 创建全文检索
);insert into t_article values(null,"Yesterday Once More","When I was young I listen to the radio",'2021-10-01');
insert into t_article values(null,"Right Here Waiting","Oceans apart, day after day,and I slowly go insane",'2021-10-02'); 
insert into t_article values(null,"My Heart Will Go On","every night in my dreams,i see you, i feel you",'2021-10-03');
insert into t_article values(null,"Everything I Do","eLook into my eyes,You will see what you mean to me",'2021-10-04');
insert into t_article values(null,"Called To Say I Love You","say love you no new year's day, to celebrate",'2021-10-05');
insert into t_article values(null,"Nothing's Gonna Change My Love For You","if i had to live my life without you near me",'2021-10-06');
insert into t_article values(null,"Everybody","We're gonna bring the flavor show U how.",'2021-10-07');

创建表的时候时候创建全文索引,不推荐

  -- fulltext (content) -- 创建全文检索-- 修改表结构添加全文索引
alter table t_article add fulltext index_content(content)-- 添加全文索引 推荐
create fulltext index index_content on t_article(content);

-- 使用全文索引
-- 跟最小的匹配的长度是相关的
SELECT * FROM t_article WHERE MATCH(content) against('you');
SELECT * FROM t_article WHERE content like '%you%';

1.10空间索引

不常用

create table shop_info (id  int  primary key auto_increment comment 'id',shop_name varchar(64) not null comment '门店名称',geom_point geometry not null comment '经纬度',spatial key geom_index(geom_point)
);

1.11hash算法

1.12二叉树

1.13B-Tree树和B+Tree树

MyISAM引擎采用的就是b+tree树作为索引结构的。

InnerDB和myisam是不一样的。

1.14索引的特点

1.15索引使用的原则

  • 经常变动的不建议

  • 数据量小的不建议

  • 重复数据多的不建议

  • 首先对where和order by的加上索引

2.存储引擎

2.1介绍

数据库底层的如那件组织。数据库管理系统使用数据引擎进行创建查询和更新以积极删除数据。

-- 查看引擎
SHOW ENGINES;

只有innnerdb是支持存储引擎的操作其他的是不支持引擎的操作的。

存储引擎的简单比较

2.2基本操作


-- 查看引擎
SHOW ENGINES;-- 查看当前默认的存储引擎
SHOW VARIABLES like '%storage_engine%'; 

-- 查看表的存储引擎
SHOW create TABLE student;

指定创建表时候的存储的引擎

CREATE TABLE `student7` (`sid` int(11) NOT NULL,`card_id` varchar(20) COLLATE utf8mb4_general_ci DEFAULT NULL,`name` varchar(20) COLLATE utf8mb4_general_ci DEFAULT NULL,`gender` varchar(20) COLLATE utf8mb4_general_ci DEFAULT NULL,`age` int(11) DEFAULT NULL,`birth` date DEFAULT NULL,`phone_num` varchar(20) COLLATE utf8mb4_general_ci DEFAULT NULL,`score` double DEFAULT NULL,PRIMARY KEY (`sid`)
) ENGINE=MyISAM -- 查看创建表时候的存储引擎
SHOW CREATE TABLE student7;

修改表的存储引擎

-- 修改表的存储引擎
ALTER TABLE student7  engine = InnoDB;
SHOW CREATE TABLE student7;

修改默认的数据库默认的存储引擎

  • 关闭服务

  • 修改myi.ini文件

  • 找到Idefault-storage-engine=INNODB 修改成自己默认的引擎

  • 重新启动服务

2.3事务操作

只有innoDB的存储引擎是支持事务的操作的。

转账的时候必须需要支持事务的操作的,需要保证转出的钱是正确的。

-- 创建账户表
create table account(id int primary key, -- 账户idname varchar(20), -- 账户名money double -- 金额
);--  插入数据
insert into account values(1,'zhangsan',1000);
insert into account values(2,'lisi',1000);

事务操作就是把几条sql绑定在一起然后采用统一的操作,将失败的进行回滚。

  • 开启事务:begin 或者是START TRANSACTION;

  • 提交事务:commit

  • 回滚事务:rollback

-- 设置的事务的时候需要先设置事务 不能自动提交
-- 需要为一个整体设置事务的操作不能单独的进行设置事务的操作
-- 设置事务操作-- 设置事务手动提交
SELECT @@autocommit;
-- 设置手动提交事务
set autocommit=0;
-- 设置事务自动提交
set autocommit=1;-- 转账的操作
BEGIN;
UPDATE  account set money=money-200 WHERE name ='zhangsan';
UPDATE  account set money=money+200 WHERE name ='lisi';
COMMIT;

-- 先执行下面的这几句sql
BEGIN;
UPDATE  account set money=money-200 WHERE name ='zhangsan';
UPDATE  account set money=money+200 WHERE name ='lisi';

此时进行下面的操作

  • 此时查询的数据是内存中的数据是没有进行持久化的数据

  • 但是navicat中得数据是持久化的数据

SELECT * FROM account;

此时内存中的数据是发生变化的。

 此时数据没有从内存中持久化到数据库中的,此时进行提交的话操作才能进行生效。提交了之后就不能进行事务的回滚的操作了。需要在没有提交的时候进行回滚的操作。

rollback;

一般的事务的操作时通过异常才进行事务的回滚的操作。正常的时候是不需要进行事务的操作。

事务的特性

  • 原子性:要么全做要么全不做

  • 一致性:一个正确的状态转换成另外一个正确的状态

  • 隔离性:事务之间是相互之间不能干扰的

  • 持久性:事务提交之后。事务的操作时永久的不能进行更改的。

2.4隔离性

isolate:事务和事务之间要 隔离起来,比如多个事务操作同一个表。

  • 读未提交:A事务会读取到B事务没有提交的数据

  • 读提交:A事务不会读取B事务没有提交的数据,但是不能重复读

  • 可重复读:有幻读

  • 序列化:互斥的,效率低下,数据库表被锁定了

 

下面是隔离级别的演示

-- 查看隔离级别 
show variables like '%isolation%';

 此时对下面表中的数据进行相关的操作。

-- 执行下面的操作
set autocommit=0;-- 设置隔离级别
/*
set session transaction isolation level 级别字符串
级别字符串:read uncommitted、read committed、repeatable read、serializable
	
*/
-- 设置read uncommitted
set session transaction isolation level read uncommitted;
-- 这种隔离级别会引起脏读,A事务读取到B事务没有提交的数据-- 设置read committed
set session transaction isolation level read committed;
-- 这种隔离级别会引起不可重复读,A事务在没有提交事务之前,可看到数据不一致-- 设置repeatable read (MySQ默认的)
set session transaction isolation level repeatable read;
-- 这种隔离级别会引起幻读,A事务在提交之前和提交之后看到的数据不一致-- 设置serializable
set session transaction isolation level serializable;
-- 这种隔离级别比较安全,但是效率低,A事务操作表时,表会被锁起,B事务不能操作。

设置读未提交

 

上面两个数据目前是正常的

分别执行

-- 设置隔离级别
set session transaction isolation level read uncommitted;

第一个开启事务

begin;

第二个开始事务

-- 开启事务
begin;

第一个zhangsan转出去500

UPDATE  account set money=money-500 WHERE name ='zhangsan';
​
​

第二个执行

SELECT * FROM account WHERE name ='zhangsan';
​

当第一个回滚了事务

rollback;

第二个再去执行


SELECT * FROM account WHERE name ='zhangsan';

此时查询到的数据就是1000

 出现了脏读。

设置读已提交

两个都进行执行

-- 设置事务隔离级别
set session transaction isolation level read committed;set autocommit=0;

第一个和第二个执行

BEGIN;

第一个执行

UPDATE  account set money=money-500 WHERE name ='zhangsan';

第二个执行

SELECT * FROM account WHERE name ='zhangsan';

 第一个执行

COMMIT;

第二个执行

SELECT * FROM account WHERE name ='zhangsan';

 

可重复读

A和B都执行下面得操作

set session transaction isolation level repeatable read;
-- 设置事务手动提交
SELECT @@autocommit;
-- 设置手动提交事务
set autocommit=0;
begin;

B执行下面得操作

SELECT * FROM account WHERE name ='zhangsan';

A执行下面得操作

UPDATE  account set money=money-500 WHERE name ='zhangsan';

B执行下面得操作

SELECT * FROM account WHERE name ='zhangsan';

此时查询得数据还是正常得。

 A提交事务

COMMIT;

B执行下面得操作

SELECT * FROM account WHERE name ='zhangsan';

此时查询得数据还是正常的。

 

此时读取的数据还是原先的数据。

B执行下面的操作

COMMIT;
SELECT * FROM account WHERE name ='zhangsan';

 B在事务提交前和提交后读取的数据是不同的。

序列化

B设置了事务执行了操作A被卡死了,只有B提交了事务A才能执行对应的操作

 

2.5锁机制

保障数据被并发进行访问的时候可以保证数据的正确性。

分类

  • 表锁:操作时。会锁定整个表。

  • 行锁:操作时,会锁定当前的行。

下面是存储引擎对锁的执行的类型

 下面是对表级别锁的介绍

 表锁是查询位置,行锁针对的是并发的操作。

2.6MyISAM

读锁 MyISAM在执行查询之前会加一个读锁。一般的情况下 不需要用户指定对应的锁。

lock table 表名 read;
select * from 表名;
-- 可以正确的进行读取。但是不能进行修改。

此时另外一个客户端

  • 可以加读锁

  • 但是不能加入写锁。

加了读锁的就不能读取别的表的数据了。和在银行中进行取钱是差不多的。

unlock tables;

此时就能操作别的操作了。

读锁是共享锁。都可以加,不能读取别的表中的数据,不能修改当前表中的数据。

写锁

A加了写锁,B不能读取也不能读取也不能加写锁的。

也就是A加了B不能读不能写的。

只能加一个写锁。

2.7InnoDB行锁

表级锁和MyISAM是相似的。

行锁。

行锁的模式

 

 

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

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

相关文章

CMA和CNAS是什么?两者有什么用途和区别?

CMA和CNAS是两个不同的概念,它们分别有着自己的用途和区别。 CMA是中国计量认证(China Metrology Accreditation)的缩写,是根据《中华人民共和国计量法》及其配套法规的规定,由国家质量监督检验检疫总局授权的计量认证…

HTML a标签

<a>标签定义一个超链接。它有如下主要属性&#xff1a; href&#xff1a;指定链接的地址&#xff0c;可以是一个URL、文件路径或锚点。target&#xff1a;指定链接在何处打开。其值包括&#xff1a; _blank&#xff1a;在新窗口或新标签页打开链接。_self&#xff1a;在…

Go语言基础之切片

切片 切片&#xff08;Slice&#xff09;是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做的一层封装。它非常灵活&#xff0c;支持自动扩容。 切片是一个引用类型&#xff0c;它的内部结构包含地址、长度和容量。切片一般用于快速地操作一块数据集合 切片的定义…

事物有哪些特性 ?MySQL 如何保证事物的四大特性 ?

目录 1.事物有哪些特性 2. MySQL 如何保证事物的四大特性 3. 事物的隔离级别 1.事物有哪些特性 1.1 何为事物 &#xff1f; 事物就是把一件事情的多个步骤&#xff0c;多个操作&#xff0c;打包成一个步骤&#xff0c;一个操作。其中任意一个步骤执行失败&#xff0c;都会进…

模拟Stevens Lewis描述的小型飞机纵向动力学的非线性动态反演控制器研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

毫米波雷达成像论文阅读笔记: IEEE TPAMI 2023 | CoIR: Compressive Implicit Radar

原始笔记链接&#xff1a;https://mp.weixin.qq.com/s?__bizMzg4MjgxMjgyMg&mid2247486680&idx1&snedf41d4f95395d7294bc958ea68d3a68&chksmcf51be21f826373790bc6d79bcea6eb2cb3d09bb1860bba0af0fd5e60c448ca006976503e460#rd ↑ \uparrow ↑点击上述链接即…

NER(命名实体识别)的介绍与使用--附源码

概述 本文将向您简要介绍命名实体识别,这是一种用于识别文本文档中存在的实体的流行方法。本文针对 NLP 领域的初学者。在本文末尾,已经实现了预训练的 NER 模型来展示实际用例。 为什么是NER? 图1 通过观察上

cad图怎么转换成pdf格式?一招教你轻松转换

将CAD文件转换成PDF格式有很多优势。首先&#xff0c;PDF格式是一种非常流行的文件格式&#xff0c;几乎所有电脑上都可以打开。这意味着即使将PDF文件发送给其他人&#xff0c;他们也可以轻松地查看文件&#xff0c;此外&#xff0c;PDF格式可以保留CAD文件的图形和布局&#…

java请求SAP系统,发起soap的xml报文,实体类转换,idea自动生成教程

1、将接口的网页地址&#xff0c;右键保存&#xff0c;然后修改文件后缀为wsdl文件 2、idea全局搜索 wsdl&#xff0c;找到自动转换javabean插件&#xff1a; 3、点击后&#xff0c;选择下载改完后缀的文件(选择)&#xff1a; 4、将无用的class文件删除掉 5、请求sap的地址为…

CSS伪类:where和:is

CSS伪类:where和:is 1 :where1.1 概述1.2 组合与叠加1.3 优先级1.4 安全性1.5 兼容性 2 :is兼容性 1 :where 1.1 概述 :where()接受选择器列表作为它的参数&#xff0c;将会选择所有能被该选择器列表中任何一条规则选中的元素。 例如&#xff0c;在以下代码中&#xff0c;a标…

Java版 招投标系统简介 招投标系统源码 java招投标系统 招投标系统功能设计tbms

​ 项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&#xff0c;以…

英文翻译照片怎么做?掌握这个方法轻松翻译

在现代社会中&#xff0c;英文已经成为了一种全球性的语言&#xff0c;因此&#xff0c;我们在阅读文章或者查看图片时&#xff0c;经常会遇到英文的内容。为了更好地理解这些英文内容&#xff0c;我们需要将其翻译成中文。在本文中&#xff0c;我将探讨图片中英文内容翻译的方…

SpringMVC 反射型跨站点脚本攻击

解决方案&#xff1a; 服务端校验&#xff0c;添加拦截器 配置web,xml <filter><filter-name>xssFilter </filter-name><filter-class>com.fh.filter.XssFilter </filter-class></filter> XssFilter package com.fh.filter;import com…

Spring Boot

前言 什么是Spring Boot&#xff1f;为什么要学Spring Boot&#xff1f; Spring 的诞⽣是为了简化Java 程序的开发的&#xff0c;⽽Spring Boot 的诞⽣是为了简化Spring 程序开发 的。Spring就像汽车&#xff0c;相比以前人只能其自行车走路&#xff0c;汽车可以帮助人们更快…

C#__使用Type类反射数据的基本用法

// 简单介绍 // 元数据&#xff08;metadata&#xff09;&#xff1a;与程序及其类型有关的数据。 // 反射&#xff1a;一个运行的程序查看本身元数据或其他程序集中的元数据的行为 // Assembly类&#xff1a;允许访问给定程序集的元数据&#xff0c;包含了可以加载和执行程序…

数字化客户运营过程中,保险企业如何释放客户旅程编排的价值?

近两年&#xff0c;受获客成本高企、转化率却没有相应提升等因素的影响&#xff0c;越来越多的企业开始重点关注存量客户经营&#xff0c;希望尽快寻找更高效的存量线索价值挖掘路径。 在此背景下&#xff0c;某保险企业与神策数据展开深度合作&#xff0c;结合存量客户转化过程…

C语言刷题训练DAY.9

1.菱形图案 解题思路&#xff1a; 这里我们先打印上面的三角&#xff0c;再打印下面的三角。 解题代码&#xff1a; #include<stdio.h> int main() {int n 0;while ((scanf("%d", &n)) ! EOF){int i 0;for (i 0; i < n; i){//先打印上面的三角int …

Ubuntu 20.04使用Livox mid 360 测试 FAST_LIO

前言 Livox mid360需要使用Livox-SDK2&#xff0c;而非Livox-SDK&#xff0c;以及对应的livox_ros_driver2 。并需要修改FAST_LIO中部分代码。 1. 安装Livox-SDK2 参考官方教程。 1.1. 安装CMake sudo apt install cmake1.2. 安装编译Livox-SDK2 git clone https://github…

1. HBase中文学习手册之揭开Hbase的神秘面纱

揭开Hbase的神秘面纱 1.1 欢迎使用 Apache Hbase1.1.1 什么是 Hbase?1.1.2 Hbase的前世今生1.1.3 HBase的技术选型&#xff1f;1.1.3.1 不适合使用 HBase的场景1.1.3.2 适合使用 HBase的场景 1.1.4 HBase的特点1.1.4.1 HBase的优点1.1.4.2 HBase的缺点 1.1.5 HBase设计架构 1.…

苹果电脑怎么录屏?步骤详解,看到就是赚到

苹果电脑作为一款受欢迎的高性能设备&#xff0c;不仅在日常工作中发挥着重要作用&#xff0c;还可以用于创造内容&#xff0c;如录制屏幕内容。录屏功能能够帮助用户将屏幕上的活动记录成视频&#xff0c;方便分享、演示或存档。可是您知道苹果电脑怎么录屏吗&#xff1f;通过…