Mysql知识梳理

Mysql知识梳理

  • 索引
    • 索引分类
    • 索引未命中的原因
    • 性能调优命令Explain
    • 回表
  • mysql性能优化
  • 事务
    • 四大特性
    • 事务隔离级别
    • 设置事务隔离级别
  • 存储引擎
  • 聚簇索引和非聚簇索引
    • 聚簇索引
    • 非聚簇索引
  • 最左前缀结合原则
  • 全文索引

索引

索引分类

mysql有普通索引、空间索引、主键索引、唯一索引、组合索引和全文索引。

  • 普通索引:使用字段关键字建立的索引,主要目的是提高查询速度。
  • 空间索引:前只有MyISAM引擎支持,用于空间类型的字段,不允许为空。
  • 唯一索引:索引列中的值必须是唯一的,但允许为空值。
  • 主键索引:是一种特殊的唯一索引,不允许有空值
  • 组合索引:在表中的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用,遵循最左前缀集合原则。
  • 全文索引:一种特殊类型的索引,主要用于全文搜索。

索引未命中的原因

  1. 没有查询条件,或查询条件中没有索引
  2. 条件中有or,并且不是所有的条件都有索引
  3. like左匹配或者int字段
  4. 索引列是字符串,但是sql中未加引号
  5. 条件中在索引列使用函数
  6. 采用not in/not exist查询
  7. B-tree索引 is null不走索引,is not null才走索引
  8. 联合索引不满足最左原则

性能调优命令Explain

explain用于解析sql的执行计划,执行计划是MySQL为了执行查询语句而制定的优化方案,包括数据的读取顺序、表的访问方式、索引的使用情况等信息。
以下是使用EXPLAIN指令的基本语法:

EXPLAIN SELECT column1, column2 FROM table_name WHERE condition;

使用EXPLAIN指令后,MySQL会返回一个表格,其中包含以下信息:

  • id:查询的标识符,id越大的越先执行。
  • select_type:查询的类型,如SIMPLE、PRIMARY、SUBQUERY等。
  • table:被查询的表名。
  • partitions:被查询的分区信息。
  • type:访问表的方式,如ALL、INDEX、RANGE等。
    – ALL: 全表扫描;
    – INDEX: 索引全扫描。
    – range: 范围扫描。
    – ref: 使用非唯一索引,或唯一索引的前缀扫描,返回匹配某个单独值得记录行。
    – eq_ref: 多表连接中使用,主键或唯一建作为关联条件。
    – const/system: 单表中最多有一个匹配行。主要用于比较primary key 或unique索引,因为数据都是唯一的,所以性能最优。
    – null: 不用访问表或索引,直接就能得到结果。
  • possible_keys:可能使用的索引。
  • key:实际使用的索引。
  • key_len:使用的索引长度。
  • ref:用于比较的值。
  • rows:MySQL估计需要读取的行数,数值越大越不好,说明没用好索引。
  • filtered:MySQL估计返回的行数占总行数的比例。
  • Extra:附加信息,如使用了临时表、文件排序等。

回表

回表指当查询条件(where条件和返回列)不能被索引索引锁覆盖时,需要访问索引中没有的数据,需要通过回表技术访问数据所在页,获取具体得数据。
与回表相对应的是覆盖查询,即查询条件能够被索引所覆盖,不需要回表查询数据,这样查询效率会更高。因此,在设计数据库时,需要根据具体的情况选择合适的索引策略,以提高查询性能。

mysql性能优化

  1. 优化sql
    1.1 使用explain命令解析sql执行计划
    1.2 尽量命中索引
    1.3 合理设计索引,不是越多越好
  2. 优化表结构
    2.1 经常查询的表尽量避免过大。
    2.2 多余常用的字段尽量冗余,避免大表进行联合查询。
  3. 分库分表进行表瘦身
    3.1 水平分库:以字段为依据,将一个库中的数据进行拆分到多个库中。比如按年份进行分库。
    3.2 水平分表:以字段为依据,将一个表中的数据进行才分到多张表中。
    3.3 垂直分库:以表为依据,按业务将表分到不同的库中。
    3.4 垂直分表:以字段为依据,按字段中的活跃度将表中的字段拆分到不同的表,比如主表和扩展表。

事务

四大特性

事务的四大特性ACID,ACID是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)的缩写,是数据库事务的基本属性,用于确保事务的可靠性和一致性。

  • 原子性:事务是一个原子操作单元,事务的执行要么全部成功,要么全部失败回滚。
  • 一致性:事务必须保证数据库从一个状态改变为另一个状态,并保持数据的一致性和完整性。
  • 隔离性:多个事务并发执行时,一个事务的执行不应影响其他事务的执行。
  • 持久性:一旦事务提交,对数据库的修改是永久的,即使系统崩溃或故障也能保持。

事务隔离级别

MySQL数据库的事务隔离级别有四个,分别是:读未提交(Read Uncommitted)、读提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。

  • 读未提交:事务中的修改,即使未提交,对其他事务也是可见的。
  • 读提交:事务只能看见已经提交的数据修改。
  • 可重复读:同一事务中多次读取数据的结果是一致的,但是并发的事务可能会对数据产生影响,导致 不可重复读和幻读。
  • 串行化:最严格的事务隔离级别,通过锁机制实现,确保事务串行化顺序执行,能避免不可重复读和幻读,但是效率低下。

mysql默认的事务隔离级别是可重复读

设置事务隔离级别

在MySQL中,可以使用以下SQL语句设置事务的隔离级别:

SET TRANSACTION ISOLATION LEVEL <isolation_level>;

存储引擎

mysql主要的存储引擎是MyISAM和InnoDB,默认使用的是InnoDB引擎。
使用以下命令查询当前使用的存储引擎:

SHOW VARIABLES LIKE 'storage_engine';

使用以下命令查询所有存储引擎:

SHOW ENGINES;
  • MyISAM:不支持事务、不支持外键,索引采用的是非聚簇索引。
  • InnoDB:提供了具有提交、回滚等事务功能,支持自动增长列,外键等功能。采用聚簇索引,索引和数据是存储在同一个文件下。

聚簇索引和非聚簇索引

聚簇索引

  1. 数据挂载在主索引的叶子节点上。
  2. 辅助索引的叶子节点指向主索引。

非聚簇索引

主索引和辅助索引的叶子节点指向数据存储的位置。

最左前缀结合原则

最左前缀原则就是使用联合索引时,查询条件需要遵循索引中列的顺序,从左到右进行匹配。
在创建多列索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边。当创建(a,b,c)复合索引时,想要索引生效的话,只能使用a、ab、ac和abc四种组合。

select a,b,c from table where a = 'v' ; #索引生效,使用索引a
select a,b,c from table where a = 'v' and b='v1'; #索引生效,使用索引ab
select a,b,c from table where a = 'v' and c='v3'; #索引生效,使用索引a
select a,b,c from table where a = 'v' and b='v1' and c='v3'; #索引生效,使用索引abc

注意:实践证明,where后面的条件顺序并不会影响索引的命中条件,即 ba和ab效果一致。原因是mysql在执行前会对where语句进行自行调优。

全文索引

MySQL的全文索引是一种用于搜索文本内容的索引方式,它可以通过分析文本内容中的关键词,帮助提高检索效率。
MySQL使用全文索引主要分为以下步骤:

创建全文索引:

ALTER TABLE table_name ADD FULLTEXT(column_name);

创建全文索引的查询:

SELECT * FROM table_name WHERE MATCH(column_name) AGAINST('keywords');

在查询语句中,column_name是要查询的列名,keywords是要搜索的关键词。

需要注意的是,只有MyISAM和InnoDB存储引擎支持全文索引,其中MyISAM引擎默认全文索引,InnoDB引擎需要手动创建全文索引。全文索引的查询还需要考虑相关性和阈值,即匹配结果太少可能会查不到结果。

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

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

相关文章

高忆管理:股市交易时间和规则?

股市是指股票买卖商场&#xff0c;出资者买卖股票来获取出资回报。买卖时刻和规矩是股票商场的核心&#xff0c;它约束了股票价格的改变和买卖者的行为。那么&#xff0c;股市的买卖时刻和规矩是什么&#xff1f;咱们应该怎么了解和运用它们来出资&#xff1f; 一、股市买卖时刻…

集成放大器 电路 分析 设计过程中的概念和要点

集成运放的三大特性&#xff1a;虚短、虚断、 和 虚地把这几个特性理解明白了&#xff0c; 后面的电路分析就很容易上手。 虚短&#xff1a;UPUN&#xff0c;两输入端电压相等。虚断&#xff1a;IPIN0&#xff0c;两输入端的输入电流为0。虚地&#xff1a;UPUN0&#xff0c…

Python Scrapy网络爬虫框架从入门到实战

Python Scrapy是一个强大的网络爬虫框架&#xff0c;它提供了丰富的功能和灵活的扩展性&#xff0c;使得爬取网页数据变得简单高效。本文将介绍Scrapy框架的基本概念、用法和实际案例&#xff0c;帮助你快速上手和应用Scrapy进行数据抓取。 Scrapy是一个基于Python的开源网络爬…

软考高级系统架构设计师系列之:论文典型试题写作要点和写作素材总结系列文章三

软考高级系统架构设计师系列之:论文典型试题写作要点和写作素材总结系列文章三 一、论Web Service 技术的应用与发展趋势1.论文题目2.写作要点和写作素材二、论系统的可靠性1.论文题目2.写作要点和写作素材三、论软件可靠性设计与应用1.论文题目2.写作要点和写作素材四、论软件…

17.1.2 【Linux】systemd使用的unit分类

systemd 有什么好处&#xff1f; 平行处理所有服务&#xff0c;加速开机流程&#xff1a; 旧的 init 启动脚本是“一项一项任务依序启动”的模式&#xff0c;因此不相依的服务也是得要一个一个的等待。但目前我们的硬件主机系统与操作系统几乎都支持多核心架构了&#xff0c;s…

【路由器】小米 WR30U 解锁并刷机

文章目录 解锁 ssh环境准备解锁过程 刷入 mt798x uboot简介刷入流程 刷入 ImmortalWrt简介刷入流程 刷为原厂固件参考资料 本文主要记录个人对小米 WR30U 路由器的解锁和刷机过程&#xff0c;整体步骤与 一般安装流程 类似&#xff0c;但是由于 WR30U 的解锁 ssh 和刷机的过程中…

【AWS】安装配置适用于 Eclipse 的 AWS 工具包

目录 0.环境 1.步骤 1&#xff09;安装Eclipse 2&#xff09;安装AWS工具包 ① 在这个路径下点开安装软件的界面 ② 点击【Add】打开添加窗口 ③ 输入aws的工具包地址 ④ 勾选需要的工具&#xff0c;点击【Next】 ⑤ 将要安装的工具&#xff0c;点击【Next】 ⑥ 选择接受…

华为云CodeArts Snap 智能编程助手PyCharm实验手册. 插件安装与使用指南

作为一款自主创新的AI代码辅助编程工具&#xff0c;华为云智能编程助手CodeArts Snap目标打造现代化开发新范式。通过将自然语言转化为规范可阅读、无开源漏洞的安全编程语言&#xff0c;提升开发者编程效率&#xff0c;助力企业快速响应市场需求。华为云CodeArts Snap现进入邀…

运算放大器发展史

在内部集成了一个补偿电容 MPS公司OP07推出后&#xff0c;大受欢迎。各家厂商都推出了自己的 这4款都是可以替换的

Delphi 中接口实现:Implementing Interfaces

目录 一、类声明&#xff08;Class Declarations&#xff09; 二、方法解决说明&#xff08;Method Resolution Clause&#xff09; 三、更改继承实现&#xff08;Changing Inherited Implementations&#xff09; 四、通过委托实现接口&#xff08;Implementing Interface…

【锐捷】OSPF 多区域配置

【实验名称】 配置 OSPF 多区域。 【实验目的】 配置 OSPF 多区域&#xff0c;理解 OSPF 层次型网络的特点。 【背景描述】 本实验拓扑图中有 3 台路由器&#xff0c;路由器在区域 0 和区域 1 中&#xff0c;路由器 B 在区域 0 和区域 30&#xff0c; 路由器 C 在区域 30。 【需…

Rocket消息存储

一、存储介质 ● 关系型数据库DB Apache下开源的另外一款MQ—ActiveMQ (默认采用的KahaDB做消息存储)可选用JDBC的方式来做消息持久化&#xff0c;通过简单的xmI配置信息即可实现JDBC消息存储。由于&#xff0c;普通关系型数据库(如Mysql)在单表数据量达到千万级别的情况下&a…

linux安装部署gitlab全教程,包含配置中文

linux安装部署gitlab全教程&#xff0c;包含配置中文 大家好&#xff0c;我是酷酷的韩~ 1.前期准备 安装包下载地址 https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/ 我这里选择的这个gitlab-ce-15.7.3-ce.0.el7.x86_64.rpm 还有一些相关依赖包(地址等审核过我放到…

pdf编辑文字怎么编辑?这几种简单编辑方法看一看

pdf编辑文字怎么编辑&#xff1f;PDF文件是一种普遍的文档格式&#xff0c;但是在编辑时却比较困难。幸运的是&#xff0c;有许多PDF编辑器可以帮助我们轻松地编辑PDF文件。本文将介绍一些简单的PDF编辑方法&#xff0c;跟着我一起来看看吧&#xff01; 第一种方法&#xff1a;…

docker for window更改到非系统盘的使用记录

1、使用Hyper-v模式的docker安装 2、安装docker for windows后安装目录没办法自己选择&#xff0c;固定在c盘 卸载后通过命令行方式设置软连接方式后重新安装来让其安装到软连接的d盘&#xff0c;解决c盘空间问题 mklink /j "C:\Program Files\Docker" "D:\Pr…

如何通过python来给手机发送一条短信?

要通过Python发送短信到手机,您可以使用不同的短信服务提供商的API。以下是一个使用Twilio和Sinch服务提供商的示例,您可以根据自己的选择来决定使用哪个。 使用Twilio发送短信: 首先,注册一个Twilio账户并获取您的账户SID、认证令牌和Twilio号码。 安装 twilio 包,如果您…

JavaFx 生成二维码工具类封装

之前星之音乐下载器有需要生成二维码功能,当时用的是一个开源库来实现的,但是没过多久,发现那个库依赖太多,有个http-client的依赖,把软件都搞大了一倍,而且有时候开发的时候下载依赖还报错,就想换个方案 于是在网上找了下解决方案,最终只需要依赖两个zxing的两个依赖即可实现…

JVM——垃圾回收器G1+垃圾回收调优

4.4 G1&#xff08;一个垃圾回收器&#xff09; 定义: 取代了CMS垃圾回收器。和CMS一样时并发的。 适用场景: 物理上分区&#xff0c;逻辑上分代。 相关JVM参数: -XX:UseG1GC-XX:G1HeapRegionSizesize-XX:MaxGCPauseMillistime 1) G1 垃圾回收阶段 三个回收阶段&#xff0…

kubeadm init 失败: failed to pull image k8s.gcr.io/etcd:3.4.13-0

一. kubeadm init 失败 报错: error execution phase preflight: [preflight] Some fatal errors occurred:[ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-apiserver:v1.19.3: output: Error response from daemon: Get https://k8s.gcr.io/v2/: net/http: reque…

基于JSP+Servlet+mysql员工权限管理系统

基于JSPServletmysql员工权限管理系统 一、系统介绍二、功能展示四、其他系统实现五、获取源码 一、系统介绍 项目类型&#xff1a;Java web项目 项目名称&#xff1a;基于JSPServlet的员工权限管理系统[qxxt] 项目架构&#xff1a;B/S架构 开发语言&#xff1a;Java语言 …