mysql刨根问底

news2024/11/19 5:52:37

索引:排好序的数据结构

二叉树:

红黑树

hash表:

b-tree:

   叶子相同深度,叶节点指针=空,索引元素不重复,从左到右递增排序

   节点带data

b+tree:

   非叶子节点只存储索引,可放更多索引

   叶子节点含all索引 用指针双向连接,提高区间访问性能

页大小16kb,2000w 高度3   3次磁盘io

   根节点常驻内存,减少磁盘io

引擎

innodb

    frm:           ibd:

   表数据文件本身按b+tree组织多索引结构文件

   聚集索引-叶节点含完整数据

myisam:索引/数据文件分离

    frm。 MYD。 MYI

    主键b+tree存储 data是地址引用,非聚集

explain少不了这个大佬

type关联类型或访问类型 

  mysql如何查找表中的行,system const  eq_ref  ref  range  index  all

  null:mysql在优化阶段分解查询语句,执行阶段不需要访问表 索引

  system,const:查询某部分优化并将其转化成一个常量

  eq_ref:primary key或unique_key 索引的all部分被连接使用,最多只会返回一条符合条件的记录

  ref:没有用唯一索引

不走索引:

   引擎本身不支持索引

   不等于 

   is null / is not null

   like 通配符: select 查询具体的列 

   复杂函数

   字符串不加单引号:类型转换

   or / in 查询时  不一定用索引,检索比例 表大小等因素不一定用索引

   范围查询优化

索引(a,b,c)

where a = 4 and b like 'kk%' and c=6;  //使用abc

where a = 4 and b like 'k%kk%' and c=7; //使用ab c

索引下推5.6后

trace工具:命令行打开 

  影响性能,分析执行计划

   sql准备阶段  格式化sql   

   sql优化阶段:去掉无意义语句

优化

order by与group by

 最左前缀法则,中间字段不能断

 using filesort 标识没走索引,order by * asc ,* desc  索引排序方式不同8后降序索引可以支持

  • using index指mysql扫描索引本身完成排序 效率高, filesort效率低没有用索引
  • order by使用索引最左前列 / where与order by条件组合满足索引最左前列
  •  尽量在索引列上完成排序,遵循索引建立时最左前缀法则
  • order by的条件不在索引列上,会产生using filesort
  • group by与order by类似,先排序后分组,索引创建顺序最左前缀法则
  • group by不需要排序可加group by null禁止排序

where 高于having,能写where中的限定条件就不要去having限定

filesort 文件排序

 单路排序:一次性取出满足条件的字段,sort buffer (1M)排序;trace看sort_mode显示sort_key additional_fields 或 sort_key,packed_additional_fields

 双路排序:回表排序,据相应条件取出排序字段和可直接定位的行数id,sort buffer排序,再次取需要的字段

  字段总长度 < max_length_for_sort_data,单路排序

  字段总长度 > max_length_for_sort_data,双路排序

索引设计原则

代码先行,索引后上

联合索引尽量覆盖

小基数字段不建索引:重复值少

长字符串前缀索引,order by和group by 中不能用

where与order by冲突时优先where

执行小表驱动大表

left  join左表驱动表  right join右边驱动表

   NLJ: 循环驱动表 读取关联字段  取出另一张被驱动表满足条件的数据,扫描磁盘

   BNL:驱动表数据读到join buffer中,被驱动表每一行取出与join buffer对比

   straight_join t1 on t2.a=t1.a 强制指定驱动表

      被驱动表的关联字段无索引的关联查询,BNL ;有索引NLJ

in:B表的数据集小于a表,in 优先exists

     select * from A where id in(select id from B);

exists当A表数据小于B,exists优先in

     select* from A where exists (select 1 from B where B.id=A.id)

count(*)  count(1)> count(字段) > count(id) 

  字段有索引:二级索引 ,比主键索引大小要小

  count(1) count(字段) 执行过程类似,count(1)不需要取字段

  count(*)做了优化,不取值 按行累加 效率高

查询mysql自己维护总行数

   myisam维护总行数,innodb不会存储总行数

show table status可查询表总行数

整型无负数,unsigned可扩大一倍

tinyint代替enum bitenum set

避免使用整数的显示宽度:不要int(10) 直接int,10是显示长度

decimal注意设置长度,精确计算

整形运算 存储实数:实数乘以相应的倍数后再操作

整数通常是最佳的数据类型:速度快 auto_increment

 myisam查询自动加给表读锁,改增删自动给涉及表加写锁

乐观锁:版本对比 CAS /   悲观锁:

表锁/页锁

行锁:

  索引上加锁,

  RR升级表锁需要解决不可重复读 (扫描过的索引被其他修改)

     幻读(间隙被其他事务插入记录) 

  RC不会升级

读锁 共享锁 悲观锁 / 写锁 排他锁

意向锁:针对表锁,mysql自己加,表的一个标识 代表已经有锁了

    意向共享锁:加共享锁前 先获取

   意向排他锁:

间隙锁:RR 两个值之间的空隙,可重复读隔离级别下才会生效

临键锁:

锁等待:

show status  like 'innodb_row_lock%';

  innodb_row_lock_current_waits  锁等待的数量

  innodb_row_lock_time_avg 每次等待平均时间

 innodb_row_lock_time_max 等待最长的一次时间

 innodb_row_lock_time 锁定的总时间

 innodb_row_lock_waits 总共等待的次数

select * from information_schema.innodb_trx;#查看事务

select * from information_schema.innodb_locks;#查看锁 8后更换data_locks

select * from information_schema.innodb_lock_waits;#锁等待  8更换data_lock_waits

show engine  innodb  status;#锁等待详细信息

 所有数据检索通过索引来完成,避免索引升级

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

  减少检索条件范围,避免间隙锁

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

  尽可能低的事务隔离级别

MVCC

RR事务开启,执行查询sql生成当前事务一致性视图read-view,该视图在事务结束前不会变化

   读已提交隔离级别每次执行查询sql都会重新生成

   视图由查询时未提交事务id数组min_id 和 已创建最大事务id max_id

   事务中查询从对应版本链最新数据逐条跟read-view做对比 read-view(100,300)300

事务

原子  一致  隔离  持久

大事务

    并发时连接池撑爆/锁太多超时阻塞/

    执行时间长 主从延迟 /回滚时间长/undo log膨胀/易死锁

优化:

 查询放事务外 (rr除外) / 避免远程调用 设置超时 / 避免一次性处理太多数据  / 

 更新设计加锁操作尽可能放到事务靠后的位置/能异步尽量异步 /  应用保证数据一致性 

隔离级别:undo多版本链

select 快照读 历史数据

update  insert   delete 当前读,最新数据

读未提交:read uncommit

  脏读,

读已提交:read commit 

    乐观锁 行锁  语句级快照读

    tx_id:

    roll_pointer:undo log

可重复读:repeatable read

    不能用版本号标识 读的是之前的   事务级快照

    幻读:新增的数据

  查询需要加锁吗?rr  读同一时间维度  需要

串行:serializable 

  读了之后不能修改

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

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

相关文章

HTTPS 从懵懵懂懂到认知清晰、从深度理解到落地实操

Https 在现代互联网应用中&#xff0c;网上诈骗、垃圾邮件、数据泄露的现象时有发生。为了数据安全&#xff0c;我们都会选择采用https技术。甚至iOS开发调用接口的时候&#xff0c;必须是https接口&#xff0c;才能调用。现在有部分浏览器也开始强制要求网站必须使用https&am…

Python(Socket) +Unreal(HTTP)

Python&#xff08;Socket&#xff09; Unreal&#xff08;HTTP&#xff09; python&#xff08;Socket&#xff09;:UE&#xff1a;Post请求并发送本机IP 上班咯&#xff0c;好久没记笔记了。。。 局域网 UE的apk&#xff0c;请求Python的Socket 跑起Socket &#xff0c;UE发 …

长安链共识算法切换:动态调整,灵活可变

#功能发布 长安链3.0正式版发布了多个重点功能&#xff0c;包括共识算法切换、支持java智能合约引擎、支持后量子密码、web3生态兼容等。我们接下来为大家详细介绍新功能的设计、应用与规划。 随着长安链应用愈加成熟与广泛&#xff0c;一些在生产中很实用的需求浮出水面。长安…

RabbitMQ 《简单消息》

package com.xzp.rabbitmq.simple; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.xzp.rabbitmq.util.ConnectionUtil; /** * "Hello World!" * 简单消息 * 消息发送者 - R - 发送消息&#xff08;生产者&#xff09; …

nandgame中的汇编语言(Assembler Language)

配置一个汇编器&#xff0c;将符号指令转换为二进制机器码。汇编器指令有三个部分&#xff1a;目标、计算和&#xff08;可选的&#xff09;跳转条件。目标是操作的输出写入的寄存器。计算是ALU操作。请参阅ALU级别的位模式。跳转条件是将触发跳转的条件。请参阅条件级别以获取…

初识云原生、虚拟化、DevOps

文章目录 K8S虚拟化DevOpsdevops平台搭建工具大数据架构 K8S master 主节点&#xff0c;控制平台&#xff0c;Master节点负责核心的调度、管理和运维&#xff0c;不需要很高性能&#xff0c;不跑任务&#xff0c;通常一个就行了&#xff0c;也可以开多个主节点来提高集群可用度…

AIGC工具系列之——基于OpenAI的GPT大模型搭建自己的AIGC工具

今天我们来讲讲目前非常火的人工智能话题“AIGC”&#xff0c;以及怎么使用目前的AI技术来开发&#xff0c;构建自己的AIGC工具 什么是AIGC&#xff1f; AIGC它的英文全称为(Artificial Intelligence Generated Content)&#xff0c;中文翻译过来就是“人工智能生成内容”&…

v4l2采集视频

Video4Linux2&#xff08;v4l2&#xff09;是用于Linux系统的视频设备驱动框架&#xff0c;它允许用户空间应用程序直接与视频设备&#xff08;如摄像头、视频采集卡等&#xff09;进行交互。 linux系统下一切皆文件&#xff0c;对视频设备的操作就像对文件的操作一样&#xff…

C语言------指针(2)

前面已经向大家介绍了指针的一些基本内容&#xff0c;接下来&#xff0c;就在再我来先大家讲解一下指针的其他内容。 1. 数组名的理解 int arr[10] { 1,2,3,4,5,6,7,8,9,10 }; 在学习数组的过程中&#xff0c;我们肯定会写过以上代码&#xff0c;我们知道 int 是该数组的数…

[BT]BUUCTF刷题第8天(3.26)

第8天 Web [CISCN2019 华北赛区 Day2 Web1]Hack World 题目明确提示flag在flag表里的flag列&#xff0c;这里先尝试1 返回&#xff1a;你好&#xff0c;glzjin想要一个女朋友。 再尝试1&#xff0c;返回bool(false) 到这里就感觉是布尔盲注的题目类型了&#xff08;虽然我没…

GPT提示词分享 —— 代码释义者

提示词&#x1f447; 我希望你能充当代码解释者&#xff0c;阐明代码的语法和语义。 3.5版本&#x1f447; free2gpt 4.0版本&#x1f447; gpt4

深入解析快速排序算法

深入解析快速排序算法 一、快速排序算法简介二、快速排序算法过程三、快速排序算法示例四、快速排序算法分析1. 时间复杂度&#xff1a;2. 空间复杂度&#xff1a;3. 稳定性&#xff1a; 五、快速排序算法优化1. 优化基准元素的选择&#xff1a;2. 优化小数组的排序&#xff1a…

[HackMyVM]靶场Crossbow

kali:192.168.56.104 靶机:192.168.56.136 端口扫描 # nmap 192.168.56.136 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-03-26 22:17 CST Nmap scan report for crossbow.hmv (192.168.56.136) Host is up (0.0057s latency). Not shown: 997 closed tcp…

Spring IOC 容器循环依赖解决(三级缓存)

对于循环依赖的解决&#xff0c;首先得了解Spring IOC 容器的创建过程&#xff0c;在加载过程中&#xff0c;Bean 的实例化和初始化是分开的&#xff0c;所以在解决循环依赖的问题时&#xff0c;也是基于Bean 的实例化和初始化分开执行这一特点。 我们将实例化后的Bean 叫 半成…

2024中国闪存市场观察:AI助推闪存全面起势?

过去两年&#xff0c;闪存市场一直处于低迷状态&#xff0c;但去年第四季度闪存颗粒资源的上涨&#xff0c;导致闪存产品价格一路上扬&#xff0c;市场遂发生反转。 2024年&#xff0c;中国闪存市场会彻底走向复苏&#xff0c;还是急转直下&#xff1f;中国AI热潮&#xff0c;…

JavaScript原型、原型对象、原型链系列详解(五)

(五)、JavaScript原型设计模式 什么是JavaScript原型设计模式&#xff1f; 为什么要使用JavaScript原型设计模式&#xff1f; JavaScript原型设计模式的实现方法有哪些&#xff1f; JavaScript原型设计模式的应用场景是什么&#xff1f; 什么是JavaScript原型设计模式&#xff…

Raft 共识算法

什么是木筏&#xff1f; Raft 是一种共识算法&#xff0c;旨在易于理解。它 在容错和性能方面与Paxos相当。不同之处在于 它被分解成相对独立的子问题&#xff0c;而且它干净利落 解决了实际系统所需的所有主要部分。我们希望 Raft 能使 更广泛的受众可以达成共识&#xff0c;并…

【网站项目】303老年人的景区订票系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

主流公链 - Cosmos

探索Cosmos区块链&#xff1a;构建互联的区块链网络 1. Cosmos简介 Cosmos是一个开放的区块链互联协议&#xff0c;旨在解决区块链之间的孤立性问题。它的愿景是构建一个可以互相通信和互操作的区块链网络&#xff0c;实现资产和数据的流动性。在Cosmos中&#xff0c;不同的区…

langchain调用语言模型chatglm4从智谱AI

目录 ​0.langchain agent 原理 ReAct 1.langchain agent使用chatgpt调用tools的源代码 2.自定义本地语言模型的代码 3.其他加速方法 背景&#xff1a;如果使用openai的chatgpt4进行语言问答&#xff0c;是需要从国内到国外的一个客户请求-->openai服务器response的一个…