Mysql高级 学习笔记分享

news2024/11/26 7:33:39

索引:Index是帮助Mysql高效获取数据的数据结构   

索引是一种数据结构    ---排好序的快速查找数据结构 、 某种满足特定查找算法的数据结构、以某种方式指向数据

两大功能:查找快、排好序

目的在于提高查询效率,类比字典

如果没有索引,那得从a找到z

mysql用order by来排序

比如图书馆有一百本书,你通过图书管理员来找,因为他记得每一本书的位置,那么图书管理员就是索引

 可以叫这种索引叫   BTree  B树索引

为什么逻辑删除数据,而不是物理删除? 第一是为了保留数据,第二是为了保护索引

增删太多可能导致索引失效

索引的优势和劣势:

优势:类似大学图书馆建书目索引,提高数据检索效率,降低数据库IO成本、通过索引列队数据进行排序,降低数据排序成本,降低CPU消耗

劣势:索引其实也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列是需要占用空间的。因为更新表的时候,mysql不仅要保存数据,还要保存一下索引文件每次更新添加了索引列的字段,都会调整因为更新所带来的键值变化后的索引信息

索引是需要不停地优化和调整的,根据用户的搜索习惯来修改优化

索引分类:

单值索引:一个索引只包含单个列,一个表可以有多个单例索引   意思就是用一个条件来找

唯一索引:索引列的值必须唯一,但允许为空值

 复合索引:一个索引包括多个列

基本语法:创建、删除、查看

mysql索引结构

Btree索引  尽量让广度大 而不是让高度更高

Hash索引

full-text全文索引

R-tree索引

什么情况建立索引?

频繁查找的应该创建索引,外键关系建立索引

查询中  统计  或分组的字段要建立索引

什么情况不要建立?

频繁更换的字段不适合建立索引

where条件中用不到的字段不创建索引

高并发情况下倾向建立组合索引 而不是单键索引

查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度

经常增删改不建立

大量重复不建立

性能分析:

Mysql的常见瓶颈:CPU、   IO、  服务器性能瓶颈

expain +   自己写的sql语句

能干嘛:  表的读取顺序、数据读取操作的操作类型、那些索引可以使用、哪些索引被实际使用、表之间的引用、每张表有多少行被优化器查询

 id:select查询的序列号,包含一组数字,表示查询中

id 相同的情况下,执行顺序从上到下

id不同:id值越大优先级越高,越先被执行

第三种情况id相同和id不同的情况同时存在  比如 1 1 2

首先  数字大的先走

在所有组中,id值越大,优先级越高,越先执行

其次id如果相同,从上往下按顺序执行

Derived代表衍生

select_type  查询类型  告诉我们是Simple简单查询还是 primary(只要包含子查询外层查询就会被标记为primary)

                                    还是subquery(在select活where列表中包含了子查询)

                                    Derived(表示是 临时表   衍生表)

                                   UNION

                                   UNION result

table显示这一行的数据是关于哪张表的

type

    最好到最差依次是 system>const>eq_ref>range>index>ALL

All代表是全表扫描  只要是百万以上的 不要用ALL 

一般来说得保证查询至少达到range级别,最好达到ref

eq_ref :唯一性索引扫描 ->公司只有一个ceo

ref  返回匹配某个单独值的所有行

range:只检索给定范围的行

index : 全索引扫描   遍历索引树

ALL:全表扫描

possible_keys   显示可能应用在这张表中的索引(但不一定被查询实际使用)

key          实际上应用到在这张表中的索引  key才是我们应该关心的真正用到的索引

key_len 表示索引中使用的字节数,可通过该列计算查询中使用的索引长度,不损失精确性的情况下,索引越短越好

ref:显示索引的哪一列被使用了  库.表.字段.常量

rows:每张表有多少行被sql查询   rows用得越少越好

Extra:  十分重要的额外信息

{

Using filesort  对数据使用一个外部的索引排序,而不是按照表内的索引顺序排序,而产生 文件排序     九死一生

Using temporary  使用了临时表保存中间结果,常见于排序order by 和分组查询group by                     十死无生 效率更低

Using index   索引被用来执行索引键值的查询  使用了索引来查询   效率高

Using where 使用了 where

其他的没这么重要

}

索引优化:

单表情况

两表情况:

如果两张表有外键,索引加在哪个表的字段上?

比如 left join on class.card = book.card  

记住   左连接建立在右表上    右连接建立在左表上 

三表的情况:如果是class  left join on class.card = book.card left join phone on book.card =phone,card  

那么索引应该建立在 book.card  和 phone.card上面

结论:

1、永远用小结果集 驱动大结果集 比如 用class来连接book  因为class大概是几十种,但是书可能有几千本几万本

2、优先优化内层循环  

3、保证join语句中被驱动表上join条件字段已经被索引

当无法保证被驱动表的join字段被索引且内存资源充足的前提下,不要太吝啬joinBuffer的设置

如何避免索引失效

全值匹配我最爱

最佳左前缀法则:查询从索引的最左前列开始并且不跳过索引中的列(where条件的使用,where按索引次序来)

比如  有三个索引   name  age    pos   

我可以用 name   因为他是火车头  但是直接用age  和pos 就等于直接用车厢跑

不在索引列上做任何操作  比如  计算,函数,自动或者手动类型转换,会导致索引失效而转向全表扫描

不能使用索引中范围条件右边的列

也就是说 比如 有  where  那么 = july   and  age >25 and pos = 'manage' 那么  age这个范围条件后面的pos=....  会失效

尽量使用覆盖索引尽量减少使用select*   尽量 取什么 用什么 

在使用不等于的时候无法使用索引  会导致全表扫描

is null  或者 is not null  也无法使用索引  导致全表扫描

like以通配符开头的sql  索引会失效变成全表扫描

解决like %字符串%(写在左边或者两边,会失效)时索引不能使用的方法?

使用复合索引   建的索引最好在查的时候跟该复合索引重合 一致

字符串 不写单引号会导致索引失效

少用or  用它来连接的时候也会导致索引失效

总结:

 

 索引面试题分析:

定值、范围还是排序,一般order by是给个范围 也就是按照某个字段去排序

group by 基本上都需要进行排序,会有临时表产生  分组之前必排序

索引是查找和 排序

一般性建议

对于单键索引,尽量选择针对当前query过滤性更好的索引

在选择组合索引的时候,当前query中过滤性最好的字段在索引字段顺序中,位置越靠前越好

在选择组合索引时,尽量选择可以包含当前query中的where子句中更多字段的索引

尽可能通过分析统计信息和调整query的写法来达到选择合适索引的目的

查询截取分析:1、观察至少一天,看看生产的慢sql情况 2、开启慢查询日志,设置阈值,比如超过5秒钟就是慢sql,并将其抓取出来3、explain+慢sql分析 4、show profile   5、运维经理或DBA进行sql数据库服务器参数调优

 

查询优化:

小表驱动大表,小的数据集驱动大的数据集

关于exist与in    假设有A in B  当B表数据集小于A表时, in 优于exist

而当B表数据大于A表时   用exist优于in

左大右小in   左小右大exist    

exist:将主查询的数据,放到子查询中做条件验证,将验证结果用true或FALSE返回

如果用排序的时候 查找顺序跟索引一直  就不会产生filesort

ORder by 满足两种情况,会使用Index方式排序:Order BY语句使用索引最左前缀 2 使用where子句与Order By子句条件组合满足索引最左前列

如果不在索引列  那么filesort有两种算法  mysql就要启动双路排序和单路排序了

提高order by  的速度

1、不要用select *

 

慢查询  开启  设置  抓取

是Mysql提供的一种日志记录,他用来记录在Mysql中响应时间超过阈值的语句

默认不会开启慢查询日志   需要自己去开启

命令   省略..

慢SQL的属性信息,比如可以用命令返回得到记录集最多的10个sql,可以得到访问次数最多的10的sql 等等

插入1000w条数据

创建函数,保证每条数据都不同:随机产生字符串,随机产生部门编号

创建存储过程,创建往emp表中插入数据的存储过程

                         创建往dept表中插入数据的存储过程

调用存储过程

性能分析 show profile  用来分析当前会话中语句执行的资源消耗情况

默认是关闭  使用需要自己开启  

开启后  使用show profile操作后  可以看到自己执行的sql的性能详情

诊断sql,show profile cpu,block,io for query

一般比较影响性能的结论  这四条都非常影响性能      convertint HEAP to MYISAM 查询结果太大,内存都不够用了往磁盘上搬了

                                              Creating tmp table  创建历史表  拷贝数据到临时表  用完再删除

                                            copying to tmp table  on disk 把内存中临时表复制到磁盘

                                           locked

全局查询日志:  (只允许在测试环境用,不要在生产环境用)

set global general_log =1  开启后会将所有执行过的查询记录到 general_log表

可以用select * from mysql.general_log 命令查看

Mysql锁机制

锁是计算机控制线程资源的一种机制

比如  一人一单  就需要锁

锁的分类 : 读锁与写锁    读锁就是共享锁   写锁就是排它锁

加锁  lock   解锁 unlock

加读锁

加了读锁后 能读自己加锁的表  不能写该表  也不能读未加锁的表

如果加了读锁   其他的session不能访问 处于阻塞状态  只有等我解锁 才能进行写操作

加写锁

自己加了写锁以后,可以读,可以写自己的表,但是不能读其他的表

其他会话可以查未加锁的表    但是查询加锁的表会被阻塞 写也会被阻塞

读锁会阻塞写,但是不会阻塞读,而写锁则会把读和写都阻塞

Myisam的读写调度是写优先,,不适合做写为主表的引擎,写锁后,其他线程不能做任何操作,大量的更新会使查询很难的到锁,从而造成永远阻塞

行锁  偏向innodb引擎,

行锁支持事务

他并不是锁整张表,而只是锁住session1正在操作的行1   session2此时是不能操作1的 会阻塞,只有当session1提交后   session2 才能操作       

但是其他没有被锁的行 2 3 4  session2可以操作

索引失效行锁升级为表锁

间隙锁的危害

间隙锁:我修改1-6的数据 未提交时      2不能够插入    这就是间隙锁

当我们用范围条件而不是相等条件检索数据,并请求共享锁或者排他锁时,innoDb会给符合条件的已有数据条件的索引项加锁,对于键值在条件范围内并不存在的记录,叫做“间隙”

show status like'innodb_row_lock%'

可以查看锁的状态  比如 等待平均时长,等待总次数,等待总时长

 

优化建议:

尽可能让所有数据检索都通过索引来完成,避免无索引行锁升级为表锁

合理设计索引,尽量缩小锁的范围

尽可能减少检索条件,避免间隙锁

尽量控制事务大小,减少锁定资源量和时间长度

尽可能使用低隔离级别

页锁   了解即可 

Mysql复制过程分为三步:

1.master将改变记录到二进制日志(binary log)  这些记录过程叫做二进制日志时间,binary log events;

2slave 将master的 binary log event 拷贝到它的中继日志(relay log);

3.slave 重做中继日志中的时间,将改变应用到自己的数据库中,Mysql复制是异步串行化的。

每个slave只有一个master

每个slave只能有一个唯一的服务器ID

每个master可以有多个salve

一主一从常见配置:

版本一致, 双边网络要ping通

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

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

相关文章

【Vue】学习笔记-列表渲染/数据监视

列表渲染/数据监视基本列表Key的作用与原理列表过滤列表排序Vue 数据监视原理基本列表 v-for指令 用于展示列表数据语法:v-for“(item,index) in xxx” :key“yyy”可遍历:数组,对象,字符串(用的很少)&am…

中国农业大学821数据结构经验贴

中国农业大学821经验贴目录个人情况说明初试复习经验数学二英语二政治数据结构复试复习经验目录 个人情况说明 初试成绩 复试成绩 复试成绩在平均水平,综合成绩第五 本科经历 河南双非GPA:3.79,专业排名第6竞赛经历:CCPC省银&…

Matlab进阶绘图第16期—三维填充折线图

三维填充折线图是在三维折线图的基础上,对其与XOY平面之间的部分进行颜色填充,从而能够更好地刻画细节变化。 由于Matlab中未收录三维填充折线图的绘制函数,因此需要大家自行设法解决。 本文使用自制的FilledPlot3小工具进行三维填充折线图…

计算机网络第一章(概述)【湖科大教书匠】

1. 各种网络 网络(Network)由若干**结点(Node)和连接这些结点的链路(Link)**组成多个网络还可以通过路由器互连起来,这样就构成了一个覆盖范围更大的网络,即互联网(互连网)。因此,互联网是"网络的网络(Network of Networks)"**因特…

扩散模型的Prompt指南:如何编写一个明确提示

Prompt(提示)是扩散模型生成图像的内容来源,构建好的提示是每一个Stable Diffusion用户需要解决的第一步。本文总结所有关于提示的内容,这样可以让你生成更准确,更好的图像 一个好的提示 首先我们看看什么是好的提示…

MCM箱模型建模方法及大气O3来源解析

详情点击链接:MCM箱模型建模方法及大气O3来源解析一、大气中O3形成、MCM和Atchem 2原理及Linux系统安装1.大气中O3形成的原理 2、MCM原理及基本流程3、Atchem 2 下载安装4、Linux系统安装5、Atchem 2 运行需要的其他工具A、Fortran;B、Python&#xff1…

小程序分包(普通分包、独立分包)

普通分包和独立分包的区别 当小程序从普通的分包页面启动的时候,首先需要下载主包独立分包是不依赖看于主包就可以运行,提升分包的执行速度,一个小程序可以有多个独立分包。 独立分包属于分包的一种。普通分包的所有限制都对独立分包有效。独…

基于LDA+SVM实现人脸识别模型

基于LDASVM实现人脸识别模型 描述 人脸识别(图像识别)是机器学习领域十经典的应用,在本质上,人脸识别属于监督学习中的分类问题。前面章节中我们已经学习了支持向量机(SVM),该算法在图像分类领…

专为智能设备安全打造 | 基于ACM32 MCU的智能断路器方案

随着我国电网建设的快速发展,数字化变电站成为建设和研究的热点,数字化变电站的核心在于一次设备的智能化与二次设备的网络化,对于断路器这种极其重要的电力一次设备而言,其智能化的实现有十分重要的意义,断路器智能化…

耗时半月,终于把牛客网上的软件测试面试八股文整理成了PDF合集(测试基础+linux+MySQL+接口测试+自动化测试+测试框架+jmeter测试+测试开发)

大家好,最近有不少小伙伴在后台留言,近期的面试越来越难了,要背的八股文越来越多了,考察得越来越细,越来越底层,明摆着就是想让我们徒手造航母嘛!实在是太为难我们这些程序员了。 这不&#xf…

【Git】速食Git,一文学会Git使用

1.什么是版本控制 版本控制是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史,方便查看更改历史记录,备份以便恢复以前的版本的软件工程技术。【通俗来说就跟我们所玩的游戏一样,不断地更新迭代游戏内容,比如…

微服务高级篇学习【4】之多级缓存

文章目录前言一 多级缓存二 JVM进程缓存2.1 案例导入2.1.1 使用docker安装mysql2.1.2 修改配置2.1.3 导入项目工程2.1.4 导入商品查询页面2.1.5 反向代理2.2 初识Caffeine2.3 实现JVM进程缓存三 Lua脚本入门3.1 安装Lua3.2 Lua语法学习四 实现多级缓存4.1 OpenResty简介4.2 Ope…

STK实例场景创建及TLE文件导入

学习过程主要参考杨颖、王琦老师的《STK在计算机仿真中的应用》。(值得注意的是,书中的STK版本为5.X,我使用的版本为11.6) 创建实例场景 在默认的工具条单击第一个按钮(或File→New),并设置场…

【NAS群晖drive异地访问】远程连接drive挂载电脑硬盘「内网穿透」

文章目录前言1.群晖Synology Drive套件的安装1.1 安装Synology Drive套件1.2 设置Synology Drive套件1.3 局域网内电脑测试和使用2.使用cpolar远程访问内网Synology Drive2.1 Cpolar云端设置2.2 Cpolar本地设置2.3 测试和使用3. 结语转发自CSDN远程穿透的文章:【群晖…

魔兽世界私服架设教程—魔兽大服务器合并列表

都说魔兽世界是最经典的网游,可惜我沉迷于程序的世界, 用以下命令down源码 git clone git://github.com/mangos/mangos.git 编译的时候会出错,找不到以下两个文件 revision.h SystemConfig.h 其实以上文件只是简单的定义同个编译的宏而…

第一章 初识NANO板卡

有人说:一个人从1岁活到80岁很平凡,但如果从80岁倒着活,那么一半以上的人都可能不凡。 生活没有捷径,我们踩过的坑都成为了生活的经验,这些经验越早知道,你要走的弯路就会越少。 本文链接:第一章 初识NANO…

事实胜于雄辩,苹果MacOs能不能玩儿机器/深度(ml/dl)学习(Python3.10/Tensorflow2)

坊间有传MacOs系统不适合机器(ml)学习和深度(dl)学习,这是板上钉钉的刻板印象,就好像有人说女生不适合编程一样的离谱。现而今,无论是Pytorch框架的MPS模式,还是最新的Tensorflow2框架,都已经可以在M1/M2芯片的Mac系统…

Transformer中的注意力机制及代码

文章目录1、简介2、原理2.1 什么是注意力机制2.2 注意力机制在NLP中解决了什么问题2.3 注意力机制公式解读2.4 注意力机制计算过程3、单头注意力机制与多头注意力机制4、代码4.1 代码14.2 代码21、简介 最近在学习transformer,首先学习了多头注意力机制&#xff0c…

Spring MVC(2)-跨域、CORS、XSS、 CSFR

同源和跨域 同源 什么是同源?请求的“协议ip(域名)端口”被称之为“源”。 如果当前页面的url和在当前页面中要访问的url具有相同的源,那么我们称这两个请求“同源”,即它们来自或者去往同一个服务器。 跨域 什么是跨域?如果…

基于ArcGIS、ENVI、InVEST、FRAGSTATS等多技术融合提升环境、生态、水文、土地、土壤、农业、大气等领域应用

【自选】 时间地点:2023年7月22日-28日【乌鲁木齐】时间地点:2023年8月12日-18日【福建泉州】 【六天实践教学、提供全部资料】 专题一、空间数据获取与制图 1.1 软件安装与应用讲解 1.2 空间数据介绍 1.3海量空间数据下载 1.4 ArcGIS软件快速入门…