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

news2024/9/20 10:54:41

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 rn
    from 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个入职员工的薪资
select
  dname,
  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.coloradmin.cn/o/2148719.html

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

相关文章

凸多边形(Convex Polygon)

凸多边形是边为直边且不向内折叠的特殊形状。连接凸多边形角的所有线都位于形状内部。凸多边形的角始终指向外部。所有边和角都相等的正多边形始终是凸多边形。 如果封闭形状具有曲面&#xff0c;则它不是凸多边形。在几何学中&#xff0c;多边形是具有直边和直角的平面二维形状…

Github 2024-09-20 Java开源项目日报Top10

根据Github Trendings的统计,今日(2024-09-20统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目10Kotlin项目1Python项目1JavaGuide - Java 程序员学习和面试指南 创建周期:2118 天开发语言:Java协议类型:Apache License 2.0Star…

二叉树(下)

目录 判断树是否相同 判断树是不是另一棵树的子树 二叉树翻转 判断平衡二叉树 二叉树层序遍历 这篇主要提供一些关于二叉树例题的讲解&#xff0c;如果对二叉树及其基本操作有疑问的可以转至&#xff1a; 二叉树&#xff08;上&#xff09;-CSDN博客二叉树&#xff08;中&…

imo云办公室 Imo_DownLoadUI.php 任意文件下载漏洞复现

0x01 漏洞描述&#xff1a; imo云办公室由上海易睦网络科技有限公司于2007年创立&#xff0c;总部位于上海&#xff0c;imo云办公室管理运营企业即时通讯平台imo&#xff0c;包括对imo的在线支持&#xff0c;故障处理&#xff0c;客户服务等&#xff0c;对imo进行持续研发&…

第五届“马栏山杯”国际音视频算法大赛创新应用赛投票环节正式启动啦!

本次大赛分为专业奖和大众人气奖。专业奖由评委直接选出。大众人气奖经组委会初筛后选出62组优秀作品&#xff0c;由网络投票选出40名获奖选手&#xff01; 快快戳链接&#x1f517;&#xff1a;https://h5.shuziwenbo.cn/challenge/vote?cxidedcrfv看看自己的作品有没有入选吧…

【AI视频】Runway Gen-2:图文生视频与运动模式详解

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AI视频 | Runway 文章目录 &#x1f4af;前言&#x1f4af;仅图片生成视频方法一&#xff1a;通过Midjourney生成图片方法二&#xff1a;通过Runway预览生成图片注意点 &#x1f4af;图加文生成视频方式一&#xff1a;Midjourney…

Web端云剪辑解决方案,BS架构私有化部署,安全可控

传统视频制作流程繁琐、耗时&#xff0c;且对专业设备和软件的高度依赖&#xff0c;常常让企业望而却步&#xff0c;美摄科技凭借其强大的技术实力和创新能力&#xff0c;推出了面向企业用户的Web端云剪辑解决方案&#xff0c;为企业提供一站式、高效、便捷的视频生产平台。 B…

计算机考研408-计算机网络

【题33】下列选项中&#xff0c;不属于网络体系结构所描述的内容是&#xff08;&#xff09; A.网络的层次 B.每一层使用的协议 C.协议的内部实现细节 D.每一层必须完成的功能 解析&#xff1a; 本题考查的是网络体系结构相关的概念。 图1描述了网络的7层架构以及每一层所要完成…

无人机 PX4 飞控 | EKF 使用传感器汇总与添加传感器方法

无人机 PX4 飞控 | EKF 使用传感器汇总与添加传感器方法 前言飞控自带基本传感器IMU磁力计气压计静态气压位置误差校正气压计偏压补偿 高度传感器测距仪使能测距仪融合有条件 可额外配置的传感器光流外部视觉系统 新传感器确定传感器类型和接口更新硬件定义添加驱动更新EKF 前言…

MySQL:事务的ACID特性隔离级别脏读、不可重复读、幻读、Next-Key锁——场景复现

目录 1、什么是事务 2、 事务的ACID特性 2.1 事务的隔离性 3、为什么要使用事务&#xff1f; 4、查看支持事务的存储引擎 5、使用事务 5.1 控制事务 5.1.1 开启事务 5.1.2 关闭事务 5.2 开始一个事务&#xff0c;执行修改后回滚 5.3 开始一个事务&#xff0c;执行修…

观后感:《中国数据库前世今生》——时代变迁中的数据库崛起

最近观看了《中国数据库前世今生》纪录片&#xff0c;这部影片详细梳理了从1980年代至今&#xff0c;中国数据库技术发展的跌宕历程。作为一名程序员&#xff0c;这部纪录片让我不禁感慨数据库技术的飞速进步&#xff0c;也让我更深入地理解了数据库技术在我们日常生活中的重要…

如何借助项目管理系统实现审批流程的自动化与标准化?

在快节奏的项目申报领域中&#xff0c;繁琐的审批流程往往成为制约项目推进速度的瓶颈。传统的人工审批方式不仅耗时耗力&#xff0c;还容易因人为因素导致审批效率低下、结果不一致等问题。为此&#xff0c;一款能够支持在线审批流程、实现审批自动化与标准化的项目管理系统显…

Canal+RabbitMQ数据同步环境配置

Canal 是阿里巴巴开发的开源工具&#xff0c;主要用于解析 MySQL 的 binlog 日志&#xff0c;从而实现数据同步。Canal 会模拟 MySQL 从库的协议&#xff0c;订阅主库的 binlog&#xff0c;从而获取数据库的变更信息。 将 Canal 解析到的 MySQL 数据库变更消息通过 RabbitMQ 分…

算法打卡 Day34(贪心算法)-分发饼干 + 摆动序列 + 最大子序和

文章目录 理论基础Leetcode 455-分发饼干题目描述解题思路类似题目2410-运动员和训练师的最大匹配数 Leetcode 376-摆动序列题目描述解题思路 Leetcode 53-最大子序和题目描述解题思路 理论基础 贪心算法的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。 贪心算…

力扣718-最长重复子数组(Java详细题解)

题目链接&#xff1a;718. 最长重复子数组 - 力扣&#xff08;LeetCode&#xff09; 前情提要&#xff1a; 因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。 dp五部曲。 1.确定dp数组和i下标的含义。 2.确定递推公式。 3.dp初始化。 4.确定dp的遍历顺序。 5…

【CMake】使用CMake在Visual Studio内构建多文件夹工程

一、配置准备 打开VIsual Studio&#xff0c;载入写好的 C M a k e l i s t s . t x t CMakelists.txt CMakelists.txt&#xff0c;在项目中添加以下文件&#xff1a; 创建一个文件夹 f u n c s funcs funcs&#xff0c;里面放入 f u n c . h func.h func.h、 f u n c . c p …

fmql之驱动程序编写(首次)

看了正点原子的zynq系列的Linux开发指南&#xff08;pdf和视频均有&#xff09;&#xff0c;因此从最简单的程序开始。 驱动程序开发&#xff1a;&#xff08;第四期视频&#xff09; 第3.1讲 我的第一个Linux驱动-字符设备驱动框架_哔哩哔哩_bilibili 学习驱动程序编写之前&am…

【论文串烧】多媒体推荐中的模态平衡学习 | 音视频语音识别中丢失导致的模态偏差对丢失视频帧鲁棒性的影响

文章目录 一、多媒体推荐中的模态平衡学习1.1 研究背景1.2 解决问题1.3 实施方案1.4 文章摘要1.5 文章重点1.6 文章图示图 1&#xff1a;不同模型变体在 AmazonClothing 数据集上的初步研究图 2&#xff1a;CKD模型架构的说明图 3&#xff1a;在 Amazon-Clothing 数据集上训练过…

【Linux:共享内存】

共享内存的概念&#xff1a; 操作系统通过页表将共享内存的起始虚拟地址映射到当前进程的地址空间中共享内存是由需要通信的双方进程之一来创建但该资源并不属于创建它的进程&#xff0c;而属于操作系统 共享内存可以在系统中存在多份&#xff0c;供不同个数&#xff0c;不同进…

Qt窗口——QStatusBar

文章目录 状态栏状态栏创建状态栏显示临时消息状态栏添加子控件 状态栏 QStatusBar状态栏是应用程序中输出简要信息的区域&#xff0c;例如画图板下面的区域 我们也可以给程序设置状态栏&#xff0c;表示一些状态。 状态栏创建 使用Qt Creator创建项目的时候&#xff0c;如果…