《MySQL是怎样运行的》——读书笔记

2023-11-18

《MySQL是怎样运行的》小孩子4919

MySQL B+树

1、数据页

数据页之间双向链接
数据页内record单向链表
数据页内record分为多个组,每个组的最大记录组成数据槽
数据槽采用数组方式在页内存储

2、索引

索引记录为页的最小主键key+数据页号pageNo
多个索引记录组成记录页面,成为目录页,对目录页继续创建索引记录
record_type区分record类型(数据or目录项)
数据越多,索引树越深,一般不会超过4层(一般4层可以存储上百亿数据),查询性能会降低.
B+树一个节点有多个子节点,可以有效的所有树的深度.
一个B+树索引的根节点在数据字典中存储.

3、聚簇索引

聚簇索引就是数据的存储方式(所有的用户记录都存储在了叶子节点),也就是所谓的索引即数据,数据即索引
聚簇索引默认根据主键ID创建,没有主键则默认创建一个.
B+树的叶子节点存储的是完整的用户记录.

4、二级索引

页内的记录是按照非主键列的大小组织索引.
B+树的叶子节点存储的并不是完整的用户记录,而只是索引字段列+主键这两个列的值.
二级索引查询完整数据需要回表到主键索引进行查询.
联合索引是多个列建立索引,大小按照联合索引字段从左到右依次排序.

5、索引的代价

空间上的代价:每建立一个索引都要为它建立一棵B+树
时间上的代价:每次对表中的数据进行增、删、改操作时,都需要去修改各个B+树索引

6、B+树索引适用的条件

组合索引要最左匹配,where语句的字段条件顺序并不会影响是否使用到索引,MySQL有一个查询优化器会分析这些搜索多个条件并且按照可以使用的索引中列的顺序来决定先使用哪个搜索条件,后使用哪个搜索条件.
匹配列前缀可以走索引,如SELECT * FROM person_info WHERE name LIKE ‘As%’;
只给出后缀或者中间的某个字符串不能走索引,如SELECT * FROM person_info WHERE name LIKE ‘%As%’;
匹配范围值可以走索引,如SELECT * FROM person_info WHERE name > ‘Asa’ AND name < ‘Barlow’;
精确匹配某一列并范围匹配另外一列,如SELECT * FROM person_info WHERE name = ‘Ashburn’ AND birthday > ‘1980-01-01’ AND birthday < ‘2000-12-31’ AND phone_number > ‘15100000000’;

7、排序

ORDER BY子句里使用到了我们的索引列,就有可能省去在内存或文件中排序的步骤,如SELECT * FROM person_info ORDER BY name, birthday, phone_number LIMIT 10;
颠倒顺序就不能使用索引,前缀可以匹配的部分可以走索引.
当联合索引左边列的值为常量,也可以使用后边的列进行排序.
使用联合索引进行排序的场景,我们要求各个排序列的排序顺序是一致的,也就是要么各个列都是ASC规则排序,要么都是DESC规则排序.
排序列包含非同一个索引的列,这种情况不能使用索引进行排序
排序列使用了复杂的表达式,无法使用索引进行排序.

8、回表

需要回表的记录越多,使用二级索引的性能就越低,甚至让某些查询宁愿使用全表扫描也不使用二级索引
为了彻底告别回表操作带来的性能损耗,建议最好在查询列表里只包含索引列

9、如何挑选索引

只为用于搜索、排序或分组的列创建索引
考虑列的基数,最好为那些列的基数大的列建立索引,为基数太小列的建立索引效果可能不好
索引列的类型尽量小
索引字符串值的前缀

10、经验

让索引列在比较表达式中单独出现
主键插入顺序
冗余和重复索引
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《MySQL是怎样运行的》——读书笔记 的相关文章

  • MySQL有两个不同的密码?

    我确信它们是不同事物的密码 但我不确定是什么 当在终端连接到 MySQL 时 我输入 usr LOCAL mysql BIN mysql h host u username p然后系统会提示我输入密码 密码是 但是当使用 PHP 连接到 M
  • Java 从 SQL 数组获取 ResultSet 失败

    我试图从数据库中检索电子邮件地址 但没有成功 我的代码如下 Main System out println PortfolioData getEmails 58 So Far Returning null 投资组合数据 public sta
  • 通过我的java代码导出数据库

    我想使用我的 java 代码导出我的 MySQL 数据库 但我还没有找到任何办法 我想要做的就是我的应用程序中有一个按钮作为 导出数据库 单击该按钮时 我的数据库应导出到指定的路径 我使用了以下代码 但它不起作用 Runtime runti
  • 使用mysql在一个查询中选择多个表中的子项总数

    我整个下午都在尝试处理一个查询 或两个或三个 以获得三个表的所有子表的计数 看看我的设计 用户表 id user name 1 foo 2 bar 赢表 id won user 1 1 2 1 3 2 绘制表格 id draw user 1
  • MySQL Workbench 6.0 错误无法获取管理员的管理访问权限?

    我在这里使用 MySQL Workbench 6 0 当我选择服务器状态时 出现此错误 对此 我尝试在Google和StackOverflow上寻找解决方案 e g 这个结果 https stackoverflow com question
  • MySQL InnoDB 查询性能

    我正在尝试优化一个简单的 sql 查询 该查询将多次运行大量数据 这是场景 MySQL 与 InnoDB 表 where 和 join 中使用的所有字段都已索引 表有 FK 我不需要查询的整个缓存 但每个表的缓存是可能的 表有更多的更新 插
  • 比较表中的行以了解字段之间的差异

    我有一个包含 20 多列的表 客户端 其中大部分是历史数据 就像是 id clientID field1 field2 etc updateDate 如果我的数据如下所示 10 12 A A 2009 03 01 11 12 A B 200
  • 显示表 FULLTEXT 索引列

    我希望运行一个查询 该查询将返回表中全文索引的列列表 该表采用 MyISAM 格式 我将使用 php 来构建查询 理想情况下 我会运行查询 它会返回信息 以便我可以构造一个以逗号分隔的列字符串 例如 名 姓 电子邮箱 这在 MySQL 中可
  • PDO SQLSRV 和 PDO MySQL 在获取 int 或 float 时返回字符串

    当您获取时 PDO MS SQL Server 和 PDO MySQL 都会返回一个字符串数组 即使列的 SQL 类型本应是数字类型 例如 int 或 float 我设法解决了这个问题 但我想了解为什么它们一开始就这样设计 是不是因为PDO
  • Hibernate 对集合的查询过滤器

    我想执行以下查询 from Item i where i categoryItems catalogId catId 然而 这会产生以下异常 非法尝试取消引用集合 所以我用谷歌搜索 找到了这个 Hibernate 论坛帖子https for
  • 截断 Mysql 表 Cron 作业?

    我在如何使用 cron 作业截断 Mysql 表时遇到了一些麻烦 无论我尝试什么 我似乎都无法让数据库清除表格 感谢您的帮助 mysql uderp example pexample hlocalhost Dexample e TRUNCA
  • 阻止注销页面后的后退按钮

    我有 php 注销页面 当用户单击注销链接时 请参阅此页面并重定向到索引页面 但是当单击后退按钮时 我会看到带有用户数据的上一页 当然 当我刷新页面时 我看不到以前的页面和数据 我在单击注销并单击后退按钮后检查了其他代码 drupal 但我
  • 第三个下拉菜单不从数据库填充

    我有以下 Index php
  • 如何正确转义mysql?

    我刚刚发现如果我写 select from tbl where name like foo 然后添加 foo 作为参数及其值 a 用户数据 它不会正确转义 我勒个去 它想要 a 即使我使用参数 我还是忍不住觉得我对 sql 注入持开放态度
  • 使用 PHP 的 MySQL 连接字符串

    我正在尝试通过本地计算机连接到托管在我的服务器上的数据库 我的服务器有cPanel 11 它是一个典型的共享服务器 由CentOS提供支持 安装了PHP和MySQL 准确地说 我在同一台服务器上持有经销商帐户 我想在不同帐户或域之间访问数据
  • 如何在Sequelize中设置查询超时?

    我想看看如何在 Sequelize 中设置查询的超时时间 我查看了 Sequelize 文档以获取一些信息 但我找不到我要找的东西 我发现的最接近的是 pools acquire 选项 但我不想设置传入连接的超时 而是设置正在进行的查询的超
  • 忽略重复条目并在 EF Core 中的 DbContext.SaveChanges() 上提交成功条目

    我有一个 ASP Net Core 2 2 Web API 在我的一个控制器操作中 我向 MySQL 数据库表添加了一堆行 我使用的是 Pomelo 例如 dbContext AddRange entities dbContext Save
  • 将古吉拉特语文本插入 MySQL 表会产生垃圾字符和不可读的文本

    我有三个 MySQL 表 我正在向其中插入古吉拉特语内容 当我插入两个表时 它们插入得很好并且可读 但在一个表中 它显示垃圾字符 不可读的文本 我怎样才能解决这个问题 MySQL 有每个表的字符集设置 http dev mysql com
  • 在 MySQL 中使用 COUNT 时如何返回 0 而不是 null

    我使用此查询返回存储在 sTable 中的歌曲列表以及存储在 sTable2 中的总项目数 SQL queries Get data to display sQuery SELECT SQL CALC FOUND ROWS str repl
  • Laravel leftJoin 仅右表的最后一条记录

    我是 Laravel 的新手 我有两张桌子 1 产品 2 价格 products id product int p key name varchar prices id price int p key id product int

随机推荐

  • 2.VHDL的基本结构和语法(一)

    目录 1 VHDL基本结构 1 1 实体 Entity 类属说明 端口方向 IN OUT INOUT BUFFER 1 2 结构体 Architecture 1 3 库 程序包的调用 1 4 VHDL语句 1 4 1 并行语句 并行信号赋值
  • web项目读取resource目录下的资源

    本地读取资源文件 1 方式 File file new File src main resources properties basecom properties InputStream in new FileInputStream fil
  • 关于ScrollView嵌套多个RecyclerView滑动冲突,可以很流畅的滑动

    首先不建议过多的嵌套 可以采取其他方式替换 当ScrollIView内部只有一个RecyclerView的时候
  • 【HTML】基础常用标签汇总

    目录 前言 最基础的标签 常用标签 文本相关 文本格式化标签 图像标签 超链接 表格 列表 无序列表 有序列表 自定义列表 表单 基本结构 表单域 表单元素控件 前言 总所周知 一个网站 web 分为三部分 1 HTML 结构 2 CSS
  • 2022年最新Vue+electron项目创建

    一 前言 大多数文章都停留在electron vue中 但是这个库不怎么更新了 最近的更新是九月前 看了很多文章都换其他的工具来构建了 这里推荐GITHUB一个大佬写的基于vue cli的插件 构建项目非常简单 插件的GITHUB源代码 话
  • 力扣刷题26. 删除有序数组中的重复项

    采用双指针法 思路如下 class Solution public int removeDuplicates int nums if nums length 0 return 0 int p 0 int q 1 while q
  • 【华为OD机试真题2023B卷 JAVA&JS】选修课

    华为OD2023 B卷 机试题库全覆盖 刷题指南点这里 选修课 知识点字符串哈希表排序 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 现有两门选修课 每门选修课都有一部分学生选修 每个学生都有选修课的成绩 需要你找出同时选
  • OCaml学习笔记(二)——Introduction to Objective Camel

    Chapter2 Simple Expressions 2 1 注释语句 OCaml语言中注释部分写在 和 之间 可以相互嵌套 注释部分当作空格处理 2 2 基本表达式 OCaml中每个有效的表达式都有一个类型 某个类型的表达式不能用作其他
  • 使用 Microchip SAM9X60 OTP 存储板卡的MAC地址和序列号

    1 介绍 SAM9X60 处理器有部分OTP One Time Programming Aera 可用于存储user data 这样的话我们就可以将板卡 MAC Address和 SN 序列号写到固定的OTP User Area中 为什么要
  • Python--根据计算公式:BMI = 体重(kg) / 身高(m)^2判断身体状况

    Python 根据计算公式 BMI 体重 kg 身高 m 2判断身体状况 身体质量指数 BMI Body Mass Index 是国际上常用的衡量人体肥胖程度和是否健康的重要标准 主要用于统计分析 肥胖程度的判断不能采用体重的绝对值 它天然
  • ajax将响应结果显示到iframe,JavaScript:iframe / Ajax / JSON

    iframe 在Ajax流行之前大量使用 iframe中的src属性指定的就是一个独立的页面url地址 iframe中呈现的就是这个页面的内容 通过改变src的值 我们就可以轻松的改变iframe中的内容 类似的 刷新验证码也是同样的手段
  • 嵌入式Linux移植5. LED驱动移植 添加LED驱动到内核,测试程序成功运行

    第一次尝试开发移植Linux上的驱动 还是和当年单片机一样 从最简单的LED小灯开始 走走流程 试验结果 LED驱动已经编译进系统 产生 o文件 LED测试程序已经编译成功 产生可执行文件 但是由于疫情手头没板子 没法上板测试 开学之后测试
  • 电脑安装 MIUI+

    windows电脑 打开命令框 输入下面命令 winget install Xiaomi MIUI 如果是小米笔记本 还可以通过 小米帮助中心 小米商城 mi com 进行下载安装
  • hive与hbase之间数据的同步

    一 前言 数据同步是很多公司在做数据迁移时的一个痛点 当然互联网公司有自己的同步机制或者工具 但是困惑了我这几天的需求 还是没有得到解决 事已至此 来写这篇博客记录一下自己最近的研究成果 二 如何同步 hive如何与Hbase直接实现数据同
  • ABAP & DOI NACE OUTPUT

    ABAP上传文件的TCODE SMW0 OAOR 现在遇到的业务需求是在VA03的订单通过SAP标准的OUTPUT配置打印出order confirmation以后 再打印公司的文字条款内容 WORD格式的两页纸 最开始想到的实现方式是在N
  • feign和ribbon有什么区别

    ribbon和feign都是用于调用其他服务的 不过方式不同 1 启动类使用的注解不同 ribbon用的是 RibbonClient feign用的是 EnableFeignClients 2 服务的指定位置不同 ribbon是在 Ribb
  • 【ssh】xshell的替代--WindTerm

    目录 WindTerm WindTerm 简介 如何关闭锁屏密码 3 功能 3 1 选中自动复制 右键粘贴复制的内容 3 2 打开软件自动连接 3 4 设置文件下载初始目录 4 可直接编辑bash命令行 5 界面管理 资源管理器 文件管理器
  • C++中struct的用法

    废话 struct是个很有用的东西呢 进入正题 struct的用处是定义一个新的类型 而这个类型里面可以是各种各样的东西 比如 struct node 定义一个新的类型叫node int a int b 110 char c double
  • ARM - UART4/串口软件实现字符串/字符的收发

    实验任务 1 在键盘输入一个字符 字符 1 并且打印在串口工具上 键盘输入 a gt 串口工具打印 b 2 串口工具输入一个字符串 按下回车键 会显示输入的字符串 头文件 ifndef UART4 H define UART4 H incl
  • 《MySQL是怎样运行的》——读书笔记

    MySQL是怎样运行的 小孩子4919 MySQL B 树 1 数据页 数据页之间双向链接 数据页内record单向链表 数据页内record分为多个组 每个组的最大记录组成数据槽 数据槽采用数组方式在页内存储 2 索引 索引记录为页的最小