数据库基础知识---------------------------(3)

MYSQL的索引

用于快速找出在某个列中有一特定值的行,不使用索引,MySQL必须从第一条记录开始读完整个表,直到找出相关的行。按实现方式分为Hash索引和B+Tree索引

  • 单列索引
    • 普通索引 允许在定义索引的列中插入重复值和空值
    • 唯一索引 索引列的值必须唯一,但允许有空值
    • 主键索引 在创建表时,MySQL会自动在主键列上建立一个索引.唯一非空
  • 组合索引 列值的组合必须唯一
create index indexname on table_name(column1(length),column2(length)); 
-- 创建索引的基本语法-- 普通索引
create index index_phone_name on student(phone_num,name);
-- 操作-删除索引drop index index_phone_name on student; 
-- 创建索引的基本语法-- 唯一索引
create  unique index index_phone_name on student(phone_num,name); 

select * from student where name = '张三'; 
select * from student where phone_num = '15100046637'; 
select * from student where phone_num = '15100046637' and name = '张三'; 
select * from student where name = '张三' and phone_num = '15100046637'; 
【靠左原则】
  三条sql只有 2 、 3、4能使用的到索引idx_phone_name,因为条件里面必须包含索引前面的字段  才能够进行匹配。
  而3和4相比where条件的顺序不一样,为什么4可以用到索引呢?是因为mysql本身就有一层sql优化,他会根据sql来识别出来该用哪个索引,我们可以理解为3和4在mysql眼中是等价的。 

  • 创建索引
    • 创建表时直接指定
create table student(sid int primary key,card_id int,name varchar(20),gender varchar(20),age int index index_name(name) 
-- 给name列创建索引
unique index_card_id(card_id) -- 给card_id列创建索引
);
    • 直接创建

create index index_gender on student(gender); 

create unique index index_card_id on student(card_id);

    • 修改表结构时添加

alter table student add index index_age(age);

alter table student add unique index_card_id(card_id)

  • 查看索引

库中:
select * from mysql.`innodb_index_stats` a where a.`database_name` = 'mydb5';

表中:
select * from mysql.`innodb_index_stats` a where a.`database_name` = 'mydb5' and a.table_name like '%student%';

表中:
show index from student;

  • 删除索引

drop index 索引名 on 表名 
-- 或 
alter table 表名 drop index 索引名 

  • 索引的优缺点
    • 优点
    • ①大大加快数据的查询速度
      ②使用分组和排序进行数据查询时,可以显著减 
      少查询时分组和排序的时间
      ③创建唯一索引,能够保证数据库表中每一行数 据的唯一性
      ④在实现数据的参考完整性方面,可以加速表和表之间的连接
    • 缺点
    • ①创建索引和维护索引需要消耗时间,并且随着数据量的增加,时间也会增加
      ②索引需要占据磁盘空间
      ③对数据表中的数据进行增加,修改,删除时,索引也要动态的维护,降低了维护的速度
  • 创建索引的原则
  • 更新频繁的列不应设置索引

    数据量小的表不要使用索引

    重复数据多的字段不应设为索引

    首先应该考虑对where 和 order by 涉及的列上建立索引

        

MYSQL的事务

在MySQL中的事务(Transaction)是由存储引擎实现

  • 事务处理可以用来维护数据库的完整性
  • 事务用来管理 DDL、DML、DCL 操作
  • 事务的主要操作
        开启事务:BEGIN 或 Start Transaction
        提交事务:Commit
        回滚事务:Rollback 
  • set autocommit=0 禁止自动提交
  • 事务的特性
    • 原子性
          事务是一个不可分割的主体,开启后的操作要么全做要么全不做
    • 一致性
          系统从一个正确状态迁移到另一个正确的状态
    • 隔离性
          每个事务的对象对其他事务的操作对象互相分离,事务提交前对其他事务不可见
    • 持久性
          事务一旦提交,其结果是永久性的
  • 事务的隔离级别
    • set session transaction isolation level read committed;
    • show variables like '%isolation%';
      -- 查看隔离级别
    • 读未提交(Read uncommitted)
        一个事务可以读取另一个未提交事务的数据,最低级别,任何情况都无法保证,会造成脏读
    • 读已提交(Read committed)
         一个事务要等另一个事务提交后才能读取数据,可避免脏读的发生,会造成不可重复读
    • 可重复读(Repeatable read)(默认)
          就是在开始读取数据(事务开启)时,不再允许修改操作,可避免脏读、不可重复读的发生,但是会造成幻读。
    • 串行(Serializable)
         是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。

MYSQL的视图

视图(view)是一个虚拟表,非真实存在,其本质是根据SQL语句获取动态的数据集,并为其命名,用户使用时只需使用视图名称即可获取结果集,并可以将其当作表来使用。

  • 创建视图

create or replace view view_name
as 
select ename,job from emp;
 
update view1_emp set ename = '周瑜' where ename = '鲁肃';  -- 可以修改
insert into view1_emp values('孙权','文员');  -- 不可以插入

  • 修改视图

    alter view 视图名 as select语句

  • 查看表和视图

show full tables;

  • 重命名视图

    -- rename table 视图名 to 新视图名;

  • 删除视图

    -- drop view 视图名[,视图名…];

  • 视图不可更新

MYSQL的优化

  • explain分析执行计划
    •     通过 EXPLAIN命令获取 MySQL如何执行 SELECT 语句的信息,包括在 SELECT 语句执行过程中表如何连接和连接的顺序
    •         explain select * from user where uid = 1;
  • show profile分析sql
    •  show profiles 能够在做SQL优化时帮助我们了解时间都耗费到哪里去了
    •  select @@have_profiling; 
      set profiling=1; -- 开启profiling 开关; 
      show profiles;
      show profile for query 8;
      --查看到该SQL执行过程中线程8的状态和消耗的时间
  •    使用索引优化
    •     -- 创建组合索引 
    • create index idx_seller_name_sta_addr on tb_seller(name,status,address);
    •     给表创建一个主键
    •     优化insert语句
      •         合并插入        
    •     优化子查询
      •         被更高效的连接(JOIN)替代
      •             连接(Join)查询之所以更有效率一些 ,是因为MySQL不需要在内存中创建临时表来完成这个逻辑上需要两个步骤的查询工作。
    •     type类型 :system>const>eq_ref>ref>range>index>ALL

MYSQL常见的窗口函数

MySQL 8.0 新增窗口函数,窗口聚合函数在行记录上计算某个字段的结果时,可将窗口范围内的数据输入到聚合函数中,并不改变行数。

window_function ( expr ) OVER ( [PARTITION BY 分组的列... ORDER BY 排序列... rows between 起始行 and 结束行unbound preceding    表示第1行n preceding	   n表示数字, 表示向上n行, 例如: 3 preceding表示向上3行.current row          表示 当前行n following          n表示数字, 表示向下n行, 例如: 3 following 表示 向下 3行.unbound following    表示最后1行]
)
  • 序号函数
    •     row_number()
      •         select dname,salary,row_number() over(partition by dname order by salary) 等级  from employee;-- 【1,2,3,4】
    •     rank()
      •         select dname,salary,rank() over(partition by dname order by salary) 等级 from employee; -- 【1,2,2,4】
    •     dense_rank()
      •         select dname,salary,dense_rank() over(partition by dname order by salary) 等级 from employee; -- 【1,2,2,3】
    --求出每个部门薪资排在前三名的员工- 分组求TOPN
select 
* 
from 
(select dname,ename,salary,dense_rank() over(partition by dname order by salary desc)  as rnfrom employee
)t
where t.rn <= 3
  • 分布函数
    •     cume_dist()
      •         用途:分组内小于、等于当前rank值的行数 / 分组内总行数
      •          应用场景:查询小于等于当前薪资(salary)的比例
    • percent_rank()
      •         用途:每行按照公式(rank-1) / (rows-1)进行计算。其中,rank为RANK()函数产生的序号,rows为当前窗口的记录总行数
      •         应用场景:不常用
 select  dname,ename,salary,cume_dist() over(order by salary) as rn1, -- 没有partition语句 所有的数据位于一组cume_dist() over(partition by dname order by salary) as rn2 
from employee;
  • 前后函数
    •     lag(列名,n,默认值)
    •     lead(列名,n,默认值)
    •     用途:返回位于当前行的前n行(LAG(expr,n))或后n行(LEAD(expr,n))的expr的值
    •     应用场景:查询前1名同学的成绩和当前同学成绩的差值
select dname,ename,hiredate,salary,lag(hiredate,1,'2000-01-01') over(partition by dname order by hiredate) as last_1_time,lag(hiredate,2) over(partition by dname order by hiredate) as last_2_time 
from employee;
  • 头尾函数
    •     first_value(列名)/last_value(列名)
    •         -- 注意,  如果不指定ORDER BY,则进行排序混乱,会出现错误的结果
    •     用途:返回第一个(FIRST_VALUE(expr))或最后一个(LAST_VALUE(expr))expr的值
    • 应用场景:截止到当前,按照日期排序查询第1个入职和最后1个入职员工的薪资
selectdname,ename,hiredate,salary,first_value(salary) over(partition by dname order by hiredate) as first,last_value(salary) over(partition by dname order by  hiredate) as last 
from  employee;
  • 其他函数
    •     nth_value(列名,n)
    •         用途:返回窗口中第n个expr的值。expr可以是表达式,也可以是列名
    •         应用场景:截止到当前薪资,显示每个员工的薪资中排名第2或者第3的薪资
        -- 查询每个部门截止目前薪资排在第二和第三的员工信息
select dname,ename,hiredate,salary,nth_value(salary,2) over(partition by dname order by hiredate) as second_score,nth_value(salary,3) over(partition by dname order by hiredate) as third_score
from employee
  •     ntile(n)
    •         用途:将分区中的有序数据分为n个等级,记录等级数
    •         应用场景:将每个部门员工分成3组并按照入职日期排序
        -- 根据入职日期将每个部门的员工分成3组
select dname,ename,hiredate,salary,
ntile(3) over(partition by dname order by  hiredate  ) as rn 
from employee;
  • 开窗聚合函数
    •     SUM,AVG,MIN,MAX,COUNT
      •         sum()纵向求和
      •         count()横向求个数

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

从黎巴嫩电子通信设备爆炸看如何防范网络电子袭击

引言&#xff1a; 在当今数字化时代&#xff0c;电子通信设备已成为我们日常生活中不可或缺的一部分。然而&#xff0c;近期黎巴嫩发生的电子设备爆炸事件提醒我们&#xff0c;这些设备也可能成为危险的武器。本文将深入探讨电子袭击的原理、防范措施&#xff0c;以及网络智能…

LangChain-Chatchat本地部署(非docker)-亲测有效全网最新

文章目录 1.相关参数2.下载安装xinference推理框架3.启动xinference下载GLM模型和模型编码器4.模型和编码器下载完成后进行检查5.创建新的虚拟环境chatchat6.将LangChain-chatchat项目拉到本地7.下载langchain-chatchat的包清华源镜像8.创建一个chatchat配置文件存储路径9.查看…

【第33章】Spring Cloud之SkyWalking服务链路追踪

文章目录 前言一、介绍1. 架构图2. SkyWalking APM 二、服务端和控制台1. 下载2. 解压3. 初始化数据库4. 增加驱动5. 修改后端配置6. 启动7. 访问控制台8. 数据库表 三、客户端1. 下载2. 设置java代理3. idea配置3.1 环境变量3.2 JVM参数3.3 启动日志 4. 启用网关插件 四、链路…

传送带异物破损裂缝检测数据集 2300张 带标注voc yolo

传送带异物破损裂缝检测数据集 2300张 带标注voc yolo 2 传送带异物破损裂缝检测数据集 数据集描述 该数据集旨在用于传送带上的异物、破损、裂缝等缺陷的检测任务。数据集包含大量的图像及其对应的标注信息&#xff0c;可用于训练计算机视觉模型&#xff0c;以识别和定位传…

求Huffman树及其matlab程序详解

#################本文为学习《图论算法及其MATLAB实现》的学习笔记################# 算法用途 求Haffman树 算法思想 根据定理4.17,给出求Huffman树的算法步骤如下: ①对给出的所要求的叶子顶点的权进行从小到大排序,写出的权重向量 ; ②根据定理4.17,写出兄弟的权重分别为…

通过iFIX在ARMxy边缘计算网关上实现维护管理

在当今快速发展的工业环境中&#xff0c;维护管理的有效性直接影响到生产效率和设备可靠性。随着物联网和边缘计算的兴起&#xff0c;传统的维护方式正在被更智能和高效的解决方案所替代。ARMxy系列的BL340控制器&#xff0c;凭借其灵活的IO配置和强大的处理能力&#xff0c;成…

OpenCV特征检测(1)检测图像中的线段的类LineSegmentDe()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 检测图像中线段的类.。 遵循在 285中描述的算法。 函数原型1 绘制两组线&#xff0c;一组用蓝色&#xff0c;一组用红色&#xff0c;并计算非重…

Java语言程序设计基础篇_编程练习题**18.30 (找出单词)

题目&#xff1a;**18.30 (找出单词) 编写一个程序&#xff0c;递归地找出某个目录下的所有文件中某个单词出现的次数。从命令行如下传递参数&#xff1a; java Exercise18_30 dirName word 习题思路 &#xff08;读取路径方法&#xff09;和18.28题差不多&#xff0c;把找…

【趣学Python算法100例】百钱百鸡

问题描述 中国古代数学家张丘建在他的《算经》中提出了一个著名的“百钱百鸡问题”&#xff1a;一只公鸡值五钱&#xff0c;一只母鸡值三钱&#xff0c;三只小鸡值一钱&#xff0c;现在要用百钱买百鸡&#xff0c;请问公鸡、母鸡、小鸡各多少只&#xff1f; 问题分析 用百钱如…

.Net网络通信组件 - TouchSocket

文章目录 .Net网络通信组件 - TouchSocket1、新建.Net8控制台项目2、Nuget安装TouchSocket组件3、编写服务端代码4、编写客户端代码5、编写Program代码6、运行效果7、日志组件&#xff08;NLog&#xff09;参考我的另一篇博客 .Net网络通信组件 - TouchSocket 1、新建.Net8控制…

图像处理软件,常用于照片编辑和修饰

一、简介 1、一款功能强大的图像处理软件&#xff0c;常用于照片编辑和修饰。它提供多种工具和特效&#xff0c;允许用户调整照片的亮度、对比度、色彩、锐化等 二、下载 1、文末有下载链接,不明白可以私聊我哈&#xff08;麻烦咚咚咚&#xff0c;动动小手给个关注收藏小三连&a…

Apache的ab压力测试工具与性能监控

【图书介绍】《软件性能测试、分析与调优实践之路&#xff08;第2版&#xff09;》_软件性能测试分析与调优实践之路-CSDN博客《软件性能测试、分析与调优实践之路&#xff08;第2版&#xff09;》(张永清)【摘要 书评 试读】- 京东图书 (jd.com) Apache的ab压力测试工具 A…

分布式Redis(14)哈希槽

文章目录 一致性哈希算法理论普通哈希的问题一致性hash算法 Redis 使用哈希槽Redis Cluster集群 为什么Redis是使用哈希槽而不是一致性哈希呢&#xff1f;为什么Redis Cluster哈希槽数量是16384&#xff1f; 关键词&#xff1a;一致性 Hash&#xff0c;哈希槽&#xff0c; 带着…

react的组件的概念和使用

文章目录 1. **组件的定义****函数组件****类组件** 2. **组件的生命周期**3. **状态管理****类组件中的状态管理****函数组件中的状态管理** 4. **组件之间的通信****通过 Props 传递数据****上下文&#xff08;Context&#xff09;** 5. **组件的样式**6. **处理表单**7. **错…

51单片机-AD(模拟信号转数字信号)-实验()

介绍AD AD转换&#xff08;Analog to Digital Conversion&#xff0c;模数转换&#xff09;是将连续的模拟信号转换为离散的数字信号的过程。这个过程在各种电子设备中都非常重要&#xff0c;特别是在涉及传感器、音频信号、视频信号等需要进行数字化处理的领域。 个人理解&a…

正也科技-辖区与指标管理系统 强化决策支持

正也科技的“辖区与指标管理系统”设计理念先进&#xff0c;旨在通过科学合理的组织架构和精细化的指标管理&#xff0c;帮助企业实现更高效的市场布局、人员配置及业绩监控。以下是对该系统核心功能的进一步阐述及其对企业运营带来的优势&#xff1a; 正也科技辖区管理 1. 组…

最新PyCharm安装详细教程及pycharm配置

目录 一、PyCharm简介及其下载网站 二、单击网站的Downloads&#xff0c;进入二级页面&#xff0c;选择对应的操作系统下载PyCharm 三、PyCharm的安装程序的安装及其配置(configuration) 1、运行PyCharm Setup 2、安装位置设置 3、安装选项设置 4、开始菜单中PyCharm快捷方式的…

【Git使用】删除Github仓库中的指定文件/文件夹

前言&#xff1a; 上篇文章带大家上传了第一个项目至github,那要是想删除仓库中的指定文件夹怎么办&#xff1f;在Github中 仓库是无法通过鼠标操作直接删除文件和文件夹的&#xff0c;那只能通过 git 命令来执行删除操作。接下来就带大家进行操作。 详细步骤&#xff1a; 一…

AI大语言模型的全面解读

大语言模型&#xff08;Large Language Models, LLMs&#xff09;无疑是近年来最耀眼的星辰之一。他们以惊人的语言生成能力、上下文理解能力以及对复杂任务的泛化能力&#xff0c;正在深刻改变着自然语言处理&#xff08;NLP&#xff09;乃至整个AI领域的格局。 本文将从专业角…

C++速通LeetCode中等第10题-轮转数组(四种方法)

方法一&#xff1a;巧用deque双向队列容器 class Solution { public:void rotate(vector<int>& nums, int k) {deque<int> q;int tmp;if(nums.size() > 1){for(auto num:nums) q.push_back(num);for(int i 0;i < k;i){tmp q.back();q.pop_back();q.pu…