【MySQL】MySQL存储引擎,索引,锁以及调优

news2024/11/29 6:27:57

文章目录

  • 存储引擎
  • MySQL中的索引
    • MySQL 索引优缺点
    • MySQL 索引类型
    • MySQL索引的实现
  • MySQL中的锁
  • MySQL8.0 新特性
  • MySQL中调优

存储引擎

MySQL 5.7 支持的存储引擎有 InnoDB、MyISAM、Memory、Merge、Archive、CSV等等存储引擎。
通过show engines; 命令查看,如下图
在这里插入图片描述
图中看到:
Support 列的值表示某种引擎是否能使用,
YES表示可以使用,
NO表示不能使用,
DEFAULT表示该引擎为当前默认的存储引擎。

简单了解一下存储引擎的描述:

存储引擎描述
InnoDB具备外键支持功能的事务处理引擎
MyISAM主要的非事务处理存储引擎
Archive用于数据存档的引擎,数据被插入后就不能在修改了,且不支持索引。
Memory置于内存的表
Merge用来管理由多个 MyISAM 表构成的表集合
CSV在存储数据时,会以逗号作为数据项之间的分隔符。

了解一下这些即可,目前大部分的业务使用MySQL默认的存储引擎InnoDB。
特点是InnoDB支持 ACID 事务、支持外键、支持行级锁提高了并发效率
MyISAM 是 MySQL 官方提供的存储引擎,其特点是支持全文索引,查询效率比较高,缺点是不支持事务、使用表级锁。

MySQL中的索引

索引是一种特殊的数据库结构,由数据表中的一列或多列组合而成,可以用来快速查询数据表中有某一特定值的记录。
是 MySQL 中十分重要的数据库对象,是数据库性能调优技术的基础,常用于实现数据的快速检索。提高业务的访问效率。

MySQL 索引优缺点

优点:

  • 通过创建数据表唯一索引可以保证表中每一行数据的唯一性。
  • 可以快速提高数据的查询速度,这是使用索引最主要的原因。
  • 在实现数据的参考完整性方面可以加速表与表之间的连接。

缺点:

  • 在数据创建和维护索引组要耗费时间,并且随着数据量的增加所耗费的时间也会增加。
  • 索引需要占磁盘空间,除了数据表占数据空间以外,每一个索引还要占一定的物理空间。如果有大量的索引,索引文件可能比数据文件更快达到最大文件尺寸。
  • 当对表中的数据进行增加、删除和修改的时候,索引也要动态维护,这样就降低了数据的维护速度。

MySQL 索引类型

在这里插入图片描述

  • 唯一索引: 表示每一列的值必须是唯一的,但允许为空值
  • 主键索引:表示每一列的值必须唯一且不允许为空值,否则会报错。通常一个表ID设置为默认递增为主键索引列。
  • 普通索引:允许索引列有重复的值出现。
  • 联合索引:是由多个列共同组成的索引。一个表中含有多个单列的索引并不是联合索引,联合索引是对多个列字段按顺序共同组成一个索引。应用联合索引时需要注意最左原则,就是 where 查询条件中的字段必须与索引字段从左到右进行匹配。
  • 全文索引:全文索引只能在 CHAR、VARCHAR、TEXT 类型字段上使用,底层使用倒排索引实现。要注意对于大数据量的表,生成全文索引会非常消耗时间也非常消耗磁盘空间。

MySQL索引的实现

在这里插入图片描述

MySQL 中最常使用的一种索引实现:BTree,B+ 树比较适合用作 > 或 < 这样的范围查询。

FullText 是全文索引,是一种记录关键字与对应文档关系的倒排索引。

Hash 是使用散列表来对数据进行索引,Hash 方式不像 B-Tree 那样需要多次查询才能定位到记录,因此 Hash 索引的效率高于 B-Tree,但是不支持范围查找和排序等功能。实际使用的也比较少。

RTree 是一种用于处理多维数据的数据结构,可以对地理数据进行空间索引。

MySQL中的锁

InnoDB 使用行级锁,而MyIASAM使用表级锁。
表锁开销小,加锁快,不会出现死锁;但是锁的粒度大,发生锁冲突的概率高,并发访问效率比较低。

行级锁开销大,加锁慢,有可能会出现死锁,不过因为锁定粒度最小,发生锁冲突的概率低,并发访问效率比较高。

共享锁也就是读锁,其他事务可以读,但不能写。MySQL 可以通过 lock in share mode 语句显示使用共享锁。

排他锁就是写锁,其他事务不能读取,也不能写。对于 UPDATE、DELETE 和 INSERT 语句,InnoDB 会自动给涉及的数据集加排他锁,或者使用 select for update 显示使用排他锁。

MySQL8.0 新特性

MySQL8.0 的一些新特性,例如:

  1. 默认字符集格式改为了 UTF-8;
  2. 增加了隐藏索引的功能,隐藏后的索引不会被查询优化器使用,可以使用这个特性用于性能调试;
  3. 支持了通用表表达式,使复杂查询中的嵌入表语句更加清晰;
  4. 新增了窗口函数的概念,可以用来实现新的查询方式。

MySQL中调优

问题:明明建立了索引的语句,但是查询效率还是很慢,如何解决呢?
通过 Explain 分析发现表中有多个索引,MySQL 的优化器选用了错误的索引,导致查询效率偏低,然后通过在 SQL 语句中使用 use index 来指定索引解决。

所以可通过两个方面进行:

第一:表结构和索引方面进行优化

  • 要为字段选择合适的数据类型,在保留扩展能力的前提下,优先选用较小的数据结构
  • 设计表结构时,考虑数据库的水平与垂直扩展能力,提前规划好未来1年的数据量、读写量的增长,规划好分库分表方案。
  • 要擅用索引,比如为经常作为查询条件的字段创建索引、创建联合索引时要根据最左原则考虑索引的复用能力,不要重复创建索引;要为保证数据不能重复的字段创建唯一索引等等。
  • 列字段尽量设置为 not null。MySQL 难以对使用 null 的列进行查询优化,允许 null 会使索引、索引统计和值更加复杂,允许 null 值的列需要更多的存储空间
  • 可以将字段多的表分解成多个表,必要时增加中间表进行关联。

第二:SQL语句进行优化

  • 通过查询 MySQL 的慢查询日志来发现需要进行优化的 SQL 语句;
  • 使用 Explain 来分析语句的执行计划,看看是否使用了索引,使用了哪个索引,扫描了多少记录,是否使用文件排序等等;
  • 避免使用 SELECT *,而是应该指定具体需要获取的字段。原因一是可以避免查询出不需要使用的字段,二是可以避免查询列字段的元信息。
  • 尽量使用索引扫描来进行排序。
  • 尽量使用 prepared statements,一个是它性能更好,另一个是可以防止 SQL 注入。

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

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

相关文章

【目标检测】Mask R-CNN论文解读

目录&#xff1a;Mask R-CNN论文解读一、Mask-RCNN流程二、Mask-RCNN结构2.1 ROI Pooling的问题2.2 ROI Align三、ROI处理架构四、损失函数一、Mask-RCNN流程 Mask R-CNN是一个实例分割&#xff08;Instance segmentation&#xff09;算法&#xff0c;通过增加不同的分支&…

PTA_1_基础编程题目集

文章目录PTA--基础编程题目集1、简单输出整数函数接口定义&#xff1a;裁判测试程序样例&#xff1a;输入样例&#xff1a;输出样例&#xff1a;题解&#xff1a;2、多项式求和函数接口定义&#xff1a;裁判测试程序样例&#xff1a;输入样例&#xff1a;输出样例&#xff1a;题…

车载以太网 - 路由激活处理机制 - 04

在前面我们已经介绍过DoIP的路由激活,不过主要是介绍路由激活的相关的概念;今天我们主要来介绍下路由激活的处理逻辑,进一步的了解软件对路由激活的处理机制,让我们更深入的了解DoIP这块的处理逻辑,更加有助于我们的工作中开发和测试工作的进行。 首先我们简单看下…

Python中的三目(元)运算符

Python中的三目(元)运算符 官方说明 https://docs.python.org/zh-cn/3/faq/programming.html#is-there-an-equivalent-of-c-s-ternary-operator 是否提供等价于 C 语言 "?:" 三目运算符的东西&#xff1f;有的。 语法形式如下&#xff1a; [on_true] if [expre…

细说——JWT攻击

目录介绍什么是JWTJWT有什么用为什么引入JWTJWT的组成JWT 特征识别JWT、JWS与JWE生成JWT视频介绍JWT攻击一些靶场JWT 攻击的影响是什么&#xff1f;JWT 攻击的漏洞是如何产生的&#xff1f;如何在 Burp Suite 中使用 JWT防御JWT攻击攻击工具爆破密钥工具&#xff1a;jwtcrack爆…

一个普通程序员,记录自己沪漂的2022年,2023年1月5日

或许对于每个人而言&#xff0c;2022年都是很艰难的&#xff0c;都是充满曲折的&#xff0c;仅仅以文字记录下我的2022年&#xff0c;我的沪漂生活。 今天是2023年1月5日&#xff0c;昨天的我做了一个梦&#xff0c;梦到自己捡到很多手机&#xff0c;于是做到工位的第一件事就…

(5)Qt中的日期和时间

QDate 日期对象格式化 d - 没有前导零的日子 (1 to 31) dd - 前导为0的日子 (01 to 31) ddd - 显示(缩写) 周一、周二、周三、周四、周五、周六、周日 dddd - 显示(完整) 星期一、星期二、…

微服务三个阶段

微服务三个阶段微服务三个阶段&#xff1a;微服务1.0&#xff1a;仅使用注册发现&#xff0c;基于Spring Cloud 或 Dubbo开发。微服务2.0&#xff1a;使用熔断、限流、降级等服务治理策略&#xff0c;并配备完整微服务工具和平台。微服务3.0&#xff1a;Service Mesh将服务治理…

https安全传输揭秘

HTTPS是什么 我们知道HTTP是明文传输的&#xff0c;恶意的中间人和窃听者通过截取用户发送的网络数据包可以拿到用户的敏感信息。尤其是涉及网上交易&#xff0c;银行转账等操作更是危害极大。 HTTPS的核心是SSL/TLS安全协议层&#xff0c;该层位于应用层和传输层之间&#x…

初识异常(Java系列10)

目录 前言&#xff1a; 1.异常的概念 2.异常的分类 2.1编译时异常 2.2运行时异常 3.异常的处理 3.1如何抛出异常 3.2异常的捕获 3.2.1异常的声明 3.2.2try-catch捕获并处理 3.3异常的处理流程 4.自定义异常类 结束语&#xff1a; 前言&#xff1a; 相信在大家学…

Windows常用命令整理

之前写了一篇关于Windows快速打开服务_陌客依天涯的博客-CSDN博客_服务快捷键 的文章&#xff0c;有表示windows还有很多常用的&#xff0c;那就整理一下&#xff0c;分享跟多点&#xff0c;希望对大家有用。 1、mstsc /*快速开启远程连接客户端*/ 2、regedit /*快速打开注册…

AcWing 1227.分巧克力(二分)

一、题目信息 二、思路分析 先从数据范围入手&#xff0c;这道题的数据范围最大是10的5次方&#xff0c;这就说明我们解决问题时的用到的算法的时间复杂度要控制在O(n)O(n)O(n)或者O(nlog(n))O(nlog(n))O(nlog(n))。 而O(nlog(n))O(nlog(n))O(nlog(n))的算法中最常用的是二分或…

基于RateLimiter+Aop+自定义注解实现QPS限流

QPS秒级限流一、Aop二、自定义注解三、测试类实例QPS简介&#xff1a;QPS&#xff08;Query Per Second&#xff09;&#xff0c;QPS 其实是衡量吞吐量&#xff08;Throughput&#xff09;的一个常用指标&#xff0c;就是说服务器在一秒的时间内处理了多少个请求 —— 我们通常…

控制流分析之构建支配树

控制流分析之构建支配树引言1 分析有向图2 构建支配树2.1 求最小半支配点2.2 求最近支配点引言 如上一个带有起始入口点的有向图为例&#xff0c;从A到Q的必经结点有A、L、M、Q&#xff0c;我们称其为Q的支配点&#xff0c;其中M为Q的最近支配点。我们将每个结点的最近支配结点…

分享124个PHP源码,总有一款适合您

PHP源码 分享124个PHP源码&#xff0c;总有一款适合您 源码下载 链接&#xff1a;https://pan.baidu.com/s/1AIktEQ0-cPRoSSAw_eA2Lw?pwdfb9m 提取码&#xff1a;fb9m 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0…

2022 Apache APISIX 年度记忆

时光已逝&#xff0c;转眼 2022 年已然落下了帷幕。Apache APISIX 社区在众多开源爱好者和开发者的陪伴下&#xff0c;又一起走过了新的四季。 在过去的一年中&#xff0c;我们的开源项目和社区都取得了许多成就&#xff0c;并得到了来自全球范围的广泛关注和支持。2022 年&am…

数据库管理与表文件管理

数据库管理&#xff1a; 1.MySql服务器管理数据库位置&#xff1a;C:\ProgramData\MySQL\MySQL Server 5.5\data 2.查看所有的数据库名 show databases; mysql> show databases;&#xff08;查看有哪些数据库 这属于MySql的命令&#xff0c;不属于SQL语句&…

硅基仿生业务全面 Serverless 容器化,14万+问答库助力糖尿病科普

作者&#xff1a;宁佑章&#xff08;硅基仿生科技&#xff09;、元毅&#xff08;阿里云容器服务&#xff09; “使用阿里云容器服务 Knative&#xff0c;解决了开发迭代慢的问题&#xff0c;加速了深度学习模型的性能提升&#xff1b;同时提供了弹性可伸缩的资源配置&#xf…

关于Linux宝塔面板nginx配置关于php项目的跨域请求

1、网上有好多跨域请求的案例。最多的如下&#xff1a; 在项目下的配置文件中添加&#xff1a; #add_header Access-Control-Allow-Origin * always; #add_header Access-Control-Allow-Credentials true; #add_header Access-Control-Allow-Methods GET,POST,OPTIONS…

新库上线 | CnOpenData中诚信绿金ESG评级数据

中诚信绿金ESG评级数据 一、数据简介 在碳达峰、碳中和的时代浪潮下&#xff0c;以环境、社会、公司治理为核心的ESG投资理念迅速成为发现资本市场投资机遇、规避投资风险的利器。中诚信绿金在多年信用评级经验的基础上通过建立契合国内政策趋势、信息披露现状、行业发展情况…