MySQL进阶知识

news2025/7/23 15:38:40

1 存储引擎

1.1 MySQL体系结构

1.2 存储引擎简介

存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表的,而不是基于库的,同一个库的多个表可以采用不同的存储引擎,所以存储引擎也经常称为表类型。创建表时可以指定存储引擎,如果不指定默认存储引擎是InnoDB。

查询建表语句:

show create table tb_brand;

CREATE TABLE `tb_brand` (
  `id` int NOT NULL AUTO_INCREMENT,
  `brand_name` varchar(20) DEFAULT NULL,
  `company_name` varchar(20) DEFAULT NULL,
  `ordered` int DEFAULT NULL,
  `description` varchar(100) DEFAULT NULL,
  `status` int DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
//主键是自增长的,下一条记录ID是8

在创建表时指定存储引擎:

ENGINE=XXX,例如ENGINE=InnoDB

查看当前数据库支持的存储引擎:

show engines;

1.2.1 InnoDB

innodb_file_per_table开关,控制着每张innodb表都创建一个表空间文件,还是所有的innodb表共用一个表空间文件。查看系统变量:

1.2.2 InnoDB的逻辑存储结构

  1. Row(一行)中包含,最后一次操作事务的ID(Trx id)、指针、各个字段

  1. page是磁盘操作的最小单元。一个Extent大小固定是1M,一个page大小固定是16K,一个Extent包含64个page

1.2.3 MyISAM和Memory

  1. Memory数据存放到内存当中,访问速度很快

  1. Memory在磁盘上只有.sdi文件

  1. Memory支持hash索引

绝大多数场景都是用InnodDB引擎。MyISAM可使用mangodb替代,Memory可使用redis替代。

2 索引

2.1 索引概述

没有索引的话,查询数据时需要全表扫描,查询效率极低;

有索引的话,需要建立一种数据结构维护数据和数据所在的内存地址关系,查询效率可大大提高;

  1. 磁盘很便宜,索引占点磁盘空间也没事

  1. 实际应用上,查询比例远远多余插入、更新、删除比例,因此降低更新表的速度这个劣势可以不考虑。

2.2 索引结构

2.2.1 二叉树和红黑树

二叉树缺点:

  1. 顺序插入时,会形成一个链表,查询性能大大降低,如图2

  1. 每个节点只有两个叶子节点,在数据量很大时,二叉树的层级会很深,检索速度很慢

二叉树的1缺点,可通过红黑树解决,如图3;但是红黑树也是二叉树,无法解决缺点2

2.2.2 Btree

2.2.3 B+tree索引

想较于B树,B+树有如下特点:

1、所有的元素都出现在叶子节点,叶子节点用来存放数据;非叶子节点只起到索引的作用

2、叶子节点形成了一个单向链表

2.2.4 Hash索引

2.2.5 InnoDB为什么选择B+树作为索引

二叉树缺点:

1、顺序插入时,会形成一个链表,查询性能大大降低,如图2

2、每个节点只有两个叶子节点,在数据量很大时,二叉树的层级会很深,检索速度很慢

红黑树缺点:

1、二叉树的1缺点,可通过红黑树解决;但是红黑树也是二叉树,无法解决缺点2

B树缺点:

1、B树叶子节点或者非叶子节点都存储数据和指针,B+树只有叶子节点存储数据,非叶子节点存储指针。

2、每页大小只有16K,相较于B树,B+树一页当中能存储更多的Key和指针,相同数据量的话B+树层级会少一些,检索速度也会更快。

Hash索引缺点

1、Hash索引只能等值匹配,=、in;不支持范围匹配,beteen and、 >、<。B+树支持范围匹配。

2、Hash所以不支持排序操作。B+树支持排序操作;

2.3 索引分类

2.3.1 聚集索引和二级索引

在一个表中,聚集索引必须得有,并且只能有一个;聚集索引叶子节点下面挂的这一行的行数据,比如5下面挂的就是id是5的这一行数据。

如果针对name这一列建立索引,建立的索引是二级索引。二级索引叶子节点挂的是这一行数据的id值。

2.3.1 回表查询

举例select * from user where name=‘Arm’,MySQL的查询流程如下:

1、从对name列建立的二级索引中查找,Lee->Geek->Arm,找到Arm节点;

2、取出Arm节点下挂的id值10,返回聚集索引继续查找;15,30->10,20->10,找到id值为10的节点;

3、取出10这个节点下面挂的行数据返回

先走二级索引找到对应的主键值,再到聚集索引中根据主键值拿到行数据

答:1高于2。1扫描一遍聚集索引即可;2需要先扫描name字段的二级索引,然后再回表查询聚集索引,两遍扫描。

2.4 索引语法

2.4.1 创建索引

UNIQUE:唯一索引

FULLTEXT:全文索引

什么都不加:常规索引

table_name:表名

index_col_name:字段名,一个索引可以关联多个字段,用,隔开。如果一个索引只关联一个字段,称为单列索引,关联多个字段的索引叫作联合索引。

为哪一张表的哪一/多个字段创建索引。

2.4.2 查看索引

查看指定表中的所有的索引。

2.4.3 删除索引

删除哪一张表中的哪一个索引。

2.4.4 索引操作案例

1、常规索引

create index name_index on tb_user(name);

2、唯一索引

create unique index phone_index on tb_user(phone);

3 create index union_index on tb_user(profession,age,status)

4 唯一索引

create unique index email_index on tb_user(email);

2.5 SQL性能分析

2.5.1 查看SQL执行频率

show global status like 'Com_______';

2.5.2 慢查询日志

查询慢查询日志是否开启:

show variables like 'slow_query_log';

2.5.3 profile查询SQL耗时

select @@have_profiling;查看当前数据库是否支持profile操作

select @@profiling;查看当前数据库profiling是否开启

set profiling=1/0;开启/关闭profiling

2.5.4 explain查看SQL语句执行计划

2.6 使用索引

2.6.1 验证索引效率

tb_brand库中总共50万条数据,给company_name建立索引后,查询时间从0.23s缩短到0.00s

注意创建索引需要建立B+Tree数据结构,这个过程耗费了1.04s。

2.6.2 联合索引-最左前缀法则

给brand_name、company_name、ordered建立联合索引index_union。brand_name是第一个字段,company_name是第二个字段,ordered是第三个字段。

如果要想用到index_union这个联合索引,select时brand_name必须放在第一个字段。如果select时中间跳过了某一列(比如company_name),后面的索引(ordered)会失效。

case1:

三个字段的索引全部用上了。

可能用到的索引、实际用到的索引:index_union

索引长度:171

case2:

用到了brand_name、company_name两个字段的索引,ordered字段的索引长度=171-166=5;

可能用到的索引、实际用到的索引:index_union

索引长度:166

case3:

用到了brand_name字段的索引,company_name字段的索引长度=166-83=83;

可能用到的索引、实际用到的索引:index_union

索引长度:83

case4:

并未用到index_union索引,因为最左侧不是brand_name字段

可能用到的索引、实际用到的索引:null

type:all,全表扫描

case5:

只用到了brand_name字段的索引,因为跳过了company_name,所以ordered字段的索引失效了

可能用到的索引、实际用到的索引:index_union

索引长度:83

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

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

相关文章

Rocketmq源码(一)手把手本地调试

很久没有学习了&#xff0c;从前是因为太忙&#xff0c;现在是因为太懒。立个flag&#xff0c;一定要把rocketmq源码看完&#xff01;源码阅读从idea的环境搭建和debug开始&#xff5e; Idea搭建调试目录代码下载代码架构启动namesvr启动broker启动consumer启动producer代码下载…

深度学习训练营之yolov5 官方代码调用以及-requirements.txt下载当中遇到的问题

深度学习训练营之yolov5 官方代码调用原文链接内容总结环境介绍前置工作简单介绍yolov5下载源码yolov5的下载遇到问题问题解析问题处理创建虚拟环境下载当中遇到的问题代码运行视频检测参考内容原文链接 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客…

taobao.trades.sold.query( 根据收件人信息查询交易单号 )

&#xffe5;开放平台免费API必须用户授权聚石塔内调用 根据收件人信息查询交易单号。 公共参数 请求地址: HTTP地址 公共请求参数: 公共响应参数: 请求参数 请求示例 TaobaoClient client new DefaultTaobaoClient(url, appkey, secret); TradesSoldQueryRequest req new…

我用了33行纯CSS实现了下划线的交互动画效果

背景 最近看到了一个特别炫酷的网站上的一个小细节&#xff0c;下划线的动画。看下他的实现效果。 但是&#xff0c;假如我们左边并没有足够的空间存放一条不可见的下划线呢&#xff1f; 像这样。 思路与实现 我要把这个下划线也做成文章刚开始的动画。就不是太好借鉴上面的思…

Windows Server 2022 中文版、英文版下载 (updated Feb 2023)

Windows Server 2022 中文版、英文版下载 (updated Feb 2023) Windows Server 2022 正式版&#xff0c;2023 年 2 月更新 请访问原文链接&#xff1a;https://sysin.org/blog/windows-server-2022/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&a…

Spring Boot 调取Bartender使用教程

Spring Boot 调取Bartender使用教程.md 原文链接&#xff1a;小回博客 博主可帮忙配置bartender进行打印&#xff0c;另有完整Mes系统源码。业务清单 文章目录Spring Boot 调取Bartender使用教程.md[toc]一、复制解压压缩包JavaBarTenderPrint.zip到C盘根目录下&#xff1a;二…

DNF搭建服务器服务端搭建教程

DNF搭建服务器服务端搭建教程 我是艾西&#xff0c;今天给大家分享下怎么样自己搭建一个DNF。 前阵子体验了下其他GM搭建的服&#xff0c;那么对于自己搭建的好处在于出道即巅峰&#xff01; 想要什么武器就是一串代码命令的事情。 下面我跟大家说一下需要准备那些东西&#x…

2023年度数学建模竞赛汇总

本人7年数学建模竞赛经验&#xff0c;历史获奖率百分之百。团队成员都是拿过全国一等奖的硕博&#xff0c;有需要数模竞赛帮助的可以私信我。 下面主要列几年一些比较有含金量的数学建模竞赛&#xff08;按比赛时间顺序&#xff09; 1. 美国大学生数学建模竞赛 报名时间&…

mars3d基础项⽬常⻅报错

1.在⼤家使⽤mars3d基础项⽬的时候经常遇到这个报错&#xff0c;截图如下 回答&#xff1a; 1.原因是因为使⽤了cnpm安装依赖&#xff0c;导致了⼀些依赖问题 2.解决⽅式也很简答&#xff0c;重新使⽤ npm 或 yarn 或 pnpm安装依赖即可 2.本地加载地图时&#xff0c;出现报错回…

云原生|kubernetes|ingress-nginx插件部署(kubernetes-1.23和最新版controller-1.6.4)

前言&#xff1a; ingress是kubernetes内的一个重要功能插件&#xff0c;这个使得服务治理成为一个可能&#xff0c;当然&#xff0c;结合微服务更为妥当了。 不管是什么插件&#xff0c;还是服务&#xff0c;第一步当然是要能顺利的部署到系统当中&#xff0c;这样&#xff…

Oracle——物化视图

文章目录含义物化视图的语法物化视图的创建1、自动刷新的物化事务 ON COMMIT2、非自动刷新的物化视图 ON demand关于手动刷新物化视图的删除资料参考含义 什么是物化视图&#xff1f; 物化视图&#xff0c;通俗点说就是物理化的视图。 什么叫物理化&#xff1f; 将视图以表结构…

【论文解读】如何使用1B参数的小模型打败GPT3.5

大型语言模型 (LLM) 通过利用思维链 (CoT) 提示生成中间推理链作为推断答案的基本原理&#xff0c;在复杂推理上表现出了令人印象深刻的性能。 然而现有的 CoT 研究主要集中在语言模态上。 我们提出 Multimodal-CoT&#xff08;多模态思维链推理模型&#xff09;&#xff0c;它…

GCC:从源文件到可执行文件

GCC&#xff1a;从源文件到可执行文件 假设我们有hello.c 文件 #include <stdio.h> int main(){printf("hello world!\n");return 0; }怎么在linux上利用GCC命令生产可执行文件&#xff08;单文件编译&#xff09;呢&#xff1f; 一、流程 C文件从源文件到…

二极管温度补偿电路工作原理分析

众所周知&#xff0c;PN结导通后有一个约为0.6V&#xff08;指硅材料PN结&#xff09;的压降&#xff0c;同时PN结还有一个与温度相关的特性&#xff1a;PN结导通后的压降基本不变&#xff0c;但不是不变&#xff0c;PN结两端的压降随温度升高而略有下降&#xff0c;温度愈高其…

Git天天用,不得不看的那些事

作为一个工作两年的开发同学&#xff0c;git是每天都要接触的工具。但IDEA对git的封装已经满足了日常的代码提交需求&#xff0c;所以一直是以点点点的形式进行代码提交与更新&#xff0c;几乎没用命令行提交过&#xff08;现在想来也是有些惭愧&#xff09;&#xff0c;对于gi…

【华为OD机试模拟题】用 C++ 实现 - 环中最长子串(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

VMware ESXi 7.0 U3k Unlocker OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版)

ESXi 7 U3 标准版集成 Intel 网卡、USB 网卡 和 NVMe 驱动 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-esxi-7-u3-sysin/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;www.sysin.org 本次针对 2023-02-21 发布的 ESXi …

Tina_Linux_系统软件 开发指南

Tina_Linux_系统软件 开发指南 1 概述 编写目的&#xff1a;本文档作为Allwinner Tina Linux系统平台开发指南&#xff0c;旨在帮助软件开发工程师、技术支持工程师快速上手&#xff0c;熟悉Tina Linux系统的开发及调试流程。 适用范围&#xff1a;Tina Linux v3.5及以上版本…

5.35 综合案例2.0 -称重数据上传云端

综合案例2.0 - 称重数据上传云端案例说明连线功能实现1.阿里云平台连接代码应用开发3.1新建‘普通项目’3.2关联产品和设备3.3新建‘移动应用’3.4添加组件3.5配置组件信息3.6保存预览案例说明 使用hx711串口模块称重,结合IOT studio制作手机APP远程控制并采集物体重量。 hx7…

自学前端,你必须要掌握的3种定时任务

当你看到这篇博客的时候&#xff0c;一定会和狗哥结下不解之缘&#xff0c;因为狗哥的博客里不仅仅有代码&#xff0c;还有很多代码之外的东西&#xff0c;如果你可以看到最底部&#xff0c;看到投票环节&#xff0c;我相信你一定感觉到了&#xff0c;狗哥的真诚&#xff0c;狗…