Mysql:常见问题

server/2024/12/22 9:09:09/

常见问题

    • 一、查询缓存和缓冲池
    • 二、为什么表数据删掉一半,表文件大小不变?
    • 三、为何选择B+Tree作为索引的数据结构?

一、查询缓存和缓冲池

1、缓冲池

  • 用于加速数据的修改和访问,通过将热点数据缓存在内存,最大限度的减少磁盘I/O
  • 默认大小为128M,Buffer Pool中数据以页为存储单位,其实现的数据结构是以页为单位的单链表
  • 由于内存的空间限制,Buffer Pool仅能容纳最热点的数据
  • Buffer Pool使用LRU算法淘汰非热点数据页

2、查询缓存和缓冲池的区别

  • 查询缓存是把缓存结果缓存起来,也就意味着只有相同的查询操作才会命中查询缓存,而且更新操作就会破坏缓存,因此Mysql的查询缓存命中率不高,在Mysql8.0中已经弃用了查询缓存
  • 缓冲池的作用是把数据页放到缓冲池中,这样在读取或修改数据的时候可以更新或者查找缓冲池中的数据,数据页中包含了很多行数据,即使这次没用到,下次也可能会用到
  • 缓冲池并不等于查询缓存,它们都是通过缓存的机制来提升效率,但缓冲池服务于数据库整体的I/O操作,而查询缓存服务于Sql查询和查询结果集的,因为命中条件苛刻,只要数据表发生变化,查询缓存就会失效

二、为什么表数据删掉一半,表文件大小不变?

1、innodb_file_per_table

  • on:每个InnoDB表数据存储在一个以.ibd为后缀的文件中
  • off:表的数据放在系统共享表空间,也就是跟数据字典放在一起
  • 建议将这个值设置为on,因为,一个表单独存储一个文件更容易管理,而且不需要这个表的时候,通过drop table命令,系统就会直接删除这个文件;而如果是放在共享表空间中,即使表删掉了,空间也是不会回收的

2、delete删表

  • Innodb只会把删除的数据标记为删除,磁盘文件的大小并不会缩小,如果之后要在这个位置再插入记录,这个记录可能会被复用
  • Innodb的数据是按页存储的,如果删掉了一个数据页的所有记录,整个数据页就可以被复用了
    记录的复用跟数据页的复用是不同的,记录的复用只限于符合范围条件的数据,而整个数据页被摘掉后,可以复用到任何位置
  • 如果用delete命令把整个表的数据删除,结果就是所有的数据页都会标记为可复用,但是磁盘上,文件不会变小,这些可以复用而没有被使用的空间,看起来就像是’空洞’
  • 不仅删除数据会造成空洞,插入数据也会造成空洞,数据如果是随机插入的,就可能造成索引的页分裂
  • 也就是说,经过大量增删改的表,都是可能存在空洞的,如果能把这些空洞去掉,就能达到收缩表空间的目的,而重建表就能达到这样的目的

3、重建表

alter table A engine = InnoDB;
会去除表A中的数据空洞,相当于drop表A,然后再按主键索引的顺序新建表A
Online DDL
允许表A向表B插入数据的过程中,对表A进行增删改

4、optimize table、analyze table、alter table这三种方式新建表的区别?

alter table t engine = InnoDB(也就是recreate)
analyze table t 其实不是重建表,只是对表的索引信息做重新统计,没有修改数据,这个过程加了MDL读锁
optimize table t 等于recreate + analyze

三、为何选择B+Tree作为索引的数据结构?

  • 数据库服务器有两种存储介质:硬盘和内存。内存是临时存储,硬盘是永久存储介质,索引只能放在磁盘中,因此磁盘的I/O次数决定了索引数据结构查询性能的好坏
  • 如果使用二叉树或者平衡二叉查找树,树的高度比较大,磁盘I/O操作多,影响查询效率
  • BTree和B+Tree都可以作为索引结构,也就是平衡的多路搜索树(m叉树),高度要远小于平衡二叉树的高度,两者的区别是:BTree所有的节点都会存储数据,B+Tree只有叶子节点会存储数据,非叶子节点只会存储索引,在进行范围查询的时候,B+Tree可以直接遍历叶子节点,BTree只能进行中序遍历

http://www.ppmy.cn/server/23037.html

相关文章

【element-ui】el-table横向滚动后,通过is-scrolling-left获取滚动高度失效的问题

el-table横向滚动后,通过is-scrolling-left获取滚动高度失效的问题 需求 现在有一个需求,需要监听el-table的纵向滚动,当滚动高度达到特定值时进行一些操作。 代码如下: methods:{throttledHandleScroll() {// 如果已经有定时器…

node环境创建Vue项目

node环境创建Vue项目 目录 node环境创建Vue项目安装node.js安装Vue创建Vue项目 安装node.js 【1】.官网下载 【2】.选择路径 【3】配置环境变量 后面就是一路next完成安装 【4】测试 cmd输入node指令,显示版本号证明安装成功 安装Vue 【1】安装cnpm 这是由淘宝…

深度学习基础之《TensorFlow框架(16)—神经网络案例》

一、mnist手写数字识别 1、数据集介绍 mnist数据集是一个经典的数据集,其中包括70000个样本,包括60000个训练样本和10000个测试样本 2、下载地址:http://yann.lecun.com/exdb/mnist/ 3、文件说明 train-images-idx3-ubyte.gz: training s…

零售数据分析方案:深度剖析人、货、场

人,即会员分析、用户分析,通过分析获得直观的用户画像,了解目标用户群体的消费水平、喜好、频率,为销售营销决策提供必要的数据支持;货,即商品分析,包括但不限于分析商品结构、分析销售top10商品…

网络编程——TCP

socket socket类型 流式套接字(SOCK_STREAM) TCP 提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复、无丢失、无失序的发送且按发送顺序接收。内设置流量控制,避免数据流淹没慢的接收方。数据被看作是字节流,无长度限制。 数据报…

IDEA中配置使用maven和配置maven的中央仓库

1 以汉化后的IDEA为例配置maven 打开idea选择文件 选择 设置 点击>构建.执行.部署 点击>构建工具 点击>Maven 其中Maven主路径 就是我们maven下载解压后的路径 可以通过边上的三个点选择你解压后的绝对路径,也可以直接把解压后的绝对路劲复制过来 以下…

使用MySQL和SQL Server生成最近七天的日期

在数据处理和报表生成过程中,经常需要生成最近一段时间内的数据。本文将介绍如何在MySQL和SQL Server数据库中使用SQL编写代码来生成最近七天的日期数据。 MySQL示例 在MySQL中,可以使用日期函数和临时表来生成最近七天的日期。以下是一个示例代码&…

2024年一季度金融读报集锦

2024一季度金融读报集锦 20240104202401052024010920240110202401152024011620240117202401182024011920240122202401232024012420240125202401262024012920240130202402012024020220240204202402052024020620240219202402202024022120240222202402232024022620240227202402282…