MySQL——存储引擎、索引

一、存储引擎

1.MySQL体系结构

2.存储引擎简介

存储引擎就是储存数据、建立索引、更新/查询数据等技术的实现方式。储存引擎是基于表的,而不是基于库的,所以存储引擎也可被称为表类型

建表语句:

查询数据库支持的储存引擎:

show engines;

3.储存引擎特点

InnoDB:一种兼顾高可靠性和高性能的通用储存引擎,在MySQL5.5之后,InnoDB是默认的MySQL储存引擎

特点:

DML操作遵循ACID模型,支持事务

行级锁,提高并发访问性能

支持外键FOREIGN KEY约束,保证数据的完整性和正确性

文件:

xxx.ibd:xxx代表的是表名,innoDB引擎的每张表都会对应这样一个表空间文件,存储表的结构(frm、sdi)、数据和索引

MyISAM:MyISAM是MySQL早期的默认存储引擎

特点:

不支持事务,不支持外键

支持表锁,不支持行锁

访问速度快

文件:

xxx.sdi:存储表结构信息

xxx.MYD:存储数据

xxx.MYI:存储索引

Memory:Memory引擎的表数据时存储在内存的,由于受到硬件问题、或断电问题的影响,只能将这些表作为临时表或缓存使用

特点:

内存存放

hash索引(默认)

文件:

xxx.sdi::存储表结构信息

二、索引

优点:

提高数据检索的效率,减低数据的IO成本

通过索引列对数据进行排序,降低数排序的成本,降低cpu的消耗

缺点:

索引列也是要占用空间的

索引大大提高了查询效率,同时也降低更新表的速度,如对表进行插入、更新、删除时,效率低

B树与B+树的区别:

B+树所有的数据都会出现在叶子节点

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

索引结构:

MySQL索引数据结构对经典的B+Tree进行了优化。在原B+Tree地基础上,增加一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的B+Tree,提高区间访问的性能

哈希索引就是采用一定的hash算法,将键值换算成新的hash值,映射到对应的槽位上,然后存储在hash表中

hash索引优点:查询效率高,通常只需要一次检索就可以了,效率通常要高于B+tree索引

hash索引缺点:不支持范围查询,无法利用索引进行排序操作

不采用二叉树的原因:B+tree相较于二叉树,层级更少,搜索效率高

不采用B树的原因:B+tree相较于B树,无论是叶子节点还是非叶子节点,都会保存数据,这样导致一页中存储的键值减少,指针跟着减少,要同样保存大量数据,只能增加树的高度,导致性能降低

不采用Hash索引的原因:hash索引只支持等值匹配,不支持范围匹配及排序操作

1.索引分类

注意:

如果存在主键,主键索引就是聚集索引

如果不存在主键,将使用第一个唯一索引作为聚集索引

如果表没有主键,或没有合适的唯一索引,则innoDB会自动生成一个rowid作为隐藏的聚集索引

2.索引语法

创建索引

查看索引

删除索引

3.SQL性能分析

(1)MySQL客户端连接成功后,通过show[session|global] status 命令可以提供服务器状态信息。

查看crud访问频次:

(2)慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有sql语句日志

注意:MySQL的慢查询日志默认没有开启,需要在MySQL的配置文件(/etc/my.cnf)中配置

查看配置信息:

 show variables like "%slow%";

开启慢查询:

 set global  slow_query_log =ON;

设定慢查询的时间:

set global slow_launch_time=1;

查看慢查询信息:

(3)show profiles能够在做SQL优化时帮助我们了解时间都耗费到哪里去了。通过have_profiling参数,能够看到当前MYSQL是否支持

查看数据库是否支持profile操作:

select @@have_profiling;

开启profile:

set profiling=1;

查看sql的执行时间:

show profiles;

查看sql语句各阶段执行情况:

 show profile for query Query_ID;

查看sql语句各阶段cpu使用情况:

 show profile cpu for query Query_ID;

(4)explain命令获取MySQL如何执行SELECT语句的信息,包括在SELECT语句执行过程中表如何连接的和连接的顺序

 explain sql语句;

id:select查询的序列号,表示查询中执行select子句或者是操作表的顺序(id相同,执行顺序从上到下;id不同,值越大,越先执行)。

type:表示连接类型,性能由好到差的连接类型为NULL、system、const、eq_ref、ref、range、index、all。

possible_key:显示可能应用在这张表上的索引,一个或多个。

Key:实际使用的索引,如果为null,则没有使用索引。

Key_len:表示索引中使用的字节数,该值为索引字段最大可能长度,并非实际使用长度,在不损失精确性的前提下,长度越短越好。

row:MySQL认为必须要执行查询的行数,在innodb引擎表中,是一个估计值,可能并不准确的。

filtered:表示返回结果得行数占需读取行数的百分比,filtered的值越大越好

4.索引的使用

(1)、如果索引了多列,要遵循最左前缀法则。最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列。如果跳跃某一列,索引将部分失效(后面的字段索引失效)。

(2)、联合索引中,出现范围查询(>,<),范围查询右侧的列索引失效。

  (3)   、不要在索引列上进行运算操作,索引将失效。

  (4)  、 字符串类型字段使用时,不加引号,索引将失效。

  (5)   、如果仅仅是尾部模糊匹配,索引不会失效。如果是头部模糊匹配,索引失效。     

(6)、 用or分割开的条件,如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及到的索引都不会被用到

(7)、如果MySQL评估使用索引比全表更慢,则不使用索引

(1)SQL提示,是优化数据库的一个重要手段,简单来说,就是在SQL语句中加入一些人为的提示来达到优化操作的目的

use index:

select id,sn  from tb_sku use index (idx_sku_sn_name) where sn= 1000000031450099999;

ignore index:

select id,sn  from tb_sku ignore index  (idx_sku_sn_name) where sn= 1000000031450099999;

force index:

select id,sn  from tb_sku force index(idx_sku_sn)  where sn= 1000000031450099999;

(2)尽量使用覆盖索引(查询使用了索引,并且需要返回的列,在该索引中已经全部能够找到),减少select*

(3)当字段类型为字符串时,有时候需要索引很长的字符串,这会让索引变得很大,查询时,浪费大量的磁盘IO,影响查询效率。此时可以只将字符串的一部分前缀,建立索引,这样可以大大节省索引空间,从而提高效率

 语法:

 create index idx_sku_sn_2 on tb_sku(sn(2));

前缀长度:可以根据索引的选择性来决定,而选择性是指不重复的索引值和数据表得记录总数的比值,索引的选择性越高则查询效率越高,唯一索引的选择性是1,这是最好的索引选择性,性能是最好的

计算公式:

select count(distinct substring(sn,1,15))/count(*) from tb_sku;

(4)在业务场景中,如果存在多哥查询条件,考虑针对于查询字段建立索引时,建议建立联合索引,而非单列索引

注意:多条件联合查询时,MYSQL优化器会评估哪个字段的索引效率高,会选择该索引完成本次查询

(5)设计原则

5、SQL优化

插入大量数据:

客户端连接服务端:

mysql --local-infile -u root -p

设置全局参数:

set global local_infile=1;

导入数据:

load data local infile 文件名称 into table 表名 fields terminated by ',' lines terminated by '\n';

主键优化:

页分裂:页可以为空,也可以填充一半,也可以填充100%。每个页包含了2-N行数据(如果一行数据太多,会行溢出),根据主键排列

页合并:当删除一行记录时,实际上记录并没有被物理删除,只是记录被标记为删除并且它的空间变得允许被其他记录声明使用

注意:

1.满足业务需求的情况下,尽量降低主键的长度

2.插入数据时,尽量选择顺序插入,选择使用自增主键

3.尽量不要使用UUID做主键或者是其他自然主键,如身份证号

4.业务操作时,避免对主键修改

order by优化:

Using filesort:通过表的索引或全表扫描,读取满足条件的数据行,然后在缓冲区中完成排序操作,所有不是通过索引直接返回排序结果的排序都叫FileSort

Using index:通过有序索引排序扫描直接返回有序数据,这种情况即为using index,不需要额外排序,操作效率高

注意:

group by优化:在分组操作时,可以通过索引来提高效率。分组操作时,索引的使用也是要满足最左前缀法则的

limit优化:limit 2000000,10,此时需要MySQL排序前2000010记录,仅仅返回2000000-2000010的记录,其他记录丢弃,查询排序的代价非常大。一般分页查询时,通过创建覆盖能够比较好地提高性能,可以通过覆盖索引加子查询地形式进行优化

示例:

 select a.* from tb_sku as a,(select id from tb_sku order by id limit 2000000,10) as b where a.id=b.id;

count优化:

MyISAM:引擎把一个表的总行数存在了磁盘上,因此执行count(*)的时候会直接返回这个树,效率很高

InnoDB:执行count(*)的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数

排序效率:count(*)=count(1)>count(主键id)>count(字段)

update优化:where之后的条件需要建立索引

innoDB的行锁是针对索引加的锁,不是针对记录加的锁,并且该索引不能失效,否则会从行锁升级为表锁。

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

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

相关文章

机器学习01——机器学习概述

上一章&#xff1a;机器学习核心知识点目录 下一章&#xff1a;机器学习02——模型评估与选择 机器学习实战项目&#xff1a;【从 0 到 1 落地】机器学习实操项目目录&#xff1a;覆盖入门到进阶&#xff0c;大学生就业 / 竞赛必备 文章目录一、参考书推荐二、机器学习的基本概…

Shell编程:检测主机ip所在网段内其他在线ip

一、逻辑设计获取本机 ip 及 网段循环检测网段内所有 ip判断 ping 结果&#xff0c;符合条件的输出相关信息二、代码展示#!/bin/bash#获取本机ip local_iphostname -I #local_ipip addr| grep "inet "|grep -v 127.0.0.1| awk {print $2}#获取本机网段 networkecho $…

Windows安装Chroma DB

安装步骤 安装python 3.8或以上的版本创建虚拟环境&#xff1a;python -m venv chroma_env激活虚拟环境&#xff1a;.\chroma_env\Scripts\activate安装Chroma DB&#xff1a;pip install chromadb(可选)安装扩展功能&#xff1a;pip install sentence-transformers pypdf tikt…

李彦宏亲自说

昨天&#xff0c;李彦宏亲自说&#xff1a;百度的数字人直播以假乱真&#xff0c;很多人是看不出这是数字人&#xff0c;而且转化率很高”这几个月百度一直在推“数字人”不再强调“大模型”了。数字人是AI落地最适合企业的一款产品&#xff0c;一般用于客服、面试、直播带货等…

JS 中bind、call、apply的区别以及手写bind

1.作用call、apply、bind作用是改变函数执行的上下文&#xff0c;简而言之就是改变函数运行时的this指向那么什么情况下需要改变this的指向呢&#xff1f;下面举个例子var name "lucy"; var obj {name: "martin",say: function () {console.log(this.nam…

vue2(7)-单页应用程序路由

1.单页应用程序如 单页&#xff1a;网易云&#xff0c;多页&#xff1a;京东单页应用程序&#xff0c;之所以开发效率高&#xff0c;性能高&#xff0c;用户体验好最大的原因是&#xff1a;页面按需更新 要按需更新&#xff0c;就要明确访问路径和组件的关系这时候就要用…

vue中通过heatmap.js实现热力图(多个热力点)热区展示(带鼠标移入弹窗)

直接上完整代码&#xff01;记录实现方式 注意heatmap.min.js需要通过heatmap.js提供的下载地址进行下载&#xff0c;地址放在下边 url&#xff1a;heatmap GIT地址 <template><div class"heatmap-view" ref"heatmapContainer"></div&g…

配置Kronos:k线金融大模型

github地址 网页btc预测demo使用的Kronos-mini模型 huggingface的仓库 文章目录配置环境安装python环境获取市场数据的库通过webui使用example中的例子prediction_example.py补充说明根据原例优化的代码CryptoDataFetcher单币对多周期预测配置环境 使用conda的环境. 首先进行换…

【Deep Learning】Ubuntu配置深度学习环境

【start: 250715】 文章目录ubuntu与深度学习安装cuda查看显卡信息&#xff08;nvidia-smi&#xff09;升级驱动下载cuda安装conda安装anaconda默认指向自己的conda初始化conda确认 conda.sh 被加载安装cuda-toolkit直接安装cuda-toolkit&#xff08;高级的&#xff09;安装高于…

车载数据采集(DAQ)解析

<摘要> 车载数据采集&#xff08;DAQ&#xff09;软件模块是现代汽车电子系统的核心组件&#xff0c;负责实时采集、处理、记录和传输车辆运行数据。本文系统解析了DAQ模块的开发&#xff0c;涵盖其随着汽车智能化演进的历史背景&#xff0c;深入阐释了信号、协议、缓存等…

强化学习框架Verl运行在单块Tesla P40 GPU配置策略及避坑指南

1.前言 由于比较穷,身边只有1块10年前的Tesla P40 GPU卡(2016年9月发布),想利用起来学习强化学习框架Verl。程序员学习开源代码,大部分人的第一直觉不是分析模块组成,而是跑起来试试,然后去debug一下后面的运行逻辑。 由于在官方部署指导文档中并未指明跑通Verl的最低…

leetcode169.多数元素

题目描述给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。题目解法博耶-摩尔多数投票算法&#xff08;英语&#xff1a;Boyer–Moore…

基于机器学习的P2P网贷平台信用违约预测模型

使用平台提供的借款人信息&#xff08;年龄、收入、历史信用等&#xff09;和借款信息&#xff0c;构建一个二分类模型来预测借款人是否会违约。重点解决类别不平衡问题和模型可解释性。逻辑回归、随机森林、XGBoost、SMOTE过采样、模型评估&#xff08;AUC, KS, F1-Score&…

豆瓣网影视数据分析与应用

源码链接&#xff1a;点击下载源码 相关文档&#xff1a;点击下载相关文档 摘 要 随着互联网的快速发展&#xff0c;豆瓣网作为一个综合性的影视评分和评论平台&#xff0c;积累了大量的用户数据&#xff0c;这些数据为影视分析提供了丰富的素材。借助Hadoop这一大数据处理框…

四、计算机网络与分布式系统(中)

一、局域网与广域网1、局域网&#xff08;1&#xff09;定义将有限地理范围内的多台计算机通过传输媒体连接&#xff0c;借助网络软件实现设备间通信与资源共享的通信网络&#xff08;2&#xff09;特点1.地理范围小&#xff1a;通常为数百米至数公里内。2.传输速率高&#xff…

Python 面向对象实战:私有属性与公有属性的最佳实践——用线段类举例

描述 在绘图软件、GIS、CAD 或简单的图形编辑器中&#xff0c;线段&#xff08;Segment&#xff09;是非常基础的对象。每个线段有两个端点&#xff08;x1,y1&#xff09;和&#xff08;x2,y2&#xff09;。在实现时我们通常希望&#xff1a; 封装端点数据&#xff08;防止外部…

流式细胞术样本处理全攻略(一):组织、血液、体液制备方法详解

摘要 流式细胞术作为多参数、高通量的细胞分析技术,在细胞表型鉴定、免疫反应研究、疾病机制探索及药物效果评估中发挥关键作用。而样本制备是流式实验成功的核心前提,需将不同来源样本处理为单颗粒悬液,并最大程度减少细胞死亡与碎片干扰。本文针对组织、外周血 / 骨髓、体…

【C#】理解.NET内存机制:堆、栈与装箱拆箱的底层逻辑及优化技巧

文章目录前言一、栈与堆1.1 栈&#xff08;Stack&#xff09;1.1.1 基本信息1.1.2 特点1.2 堆&#xff08;Heap&#xff09;1.2.1 基本信息1.2.2 特点1.3 从代码中窥见堆栈二、装箱与拆箱2.1 装箱2.2 拆箱2.3 如何避免不必要的装箱与拆箱2.3.1 泛型集合2.3.2 泛型参数总结前言 …

人工智能学习:Transformer结构中的子层连接(Sublayer Connection)

Transformer结构中的子层连接(Sublayer Connection) 一、子层连接介绍 概念 子层连接(Sublayer Connection),也称为残差连接(Residual Connection),是Transformer模型中的一个关键设计,用于将多个子层(如自注意力层和前馈全连接层)组合在一起。它通过残差连…

解锁Roo Code的强大功能:深入理解上下文提及(Context Mentions)

在AI使用中&#xff0c;我们经常需要AI或AI工具描述代码中的某个具体部分。但如果工具能直接“看到”所指的代码、错误信息甚至终端输出&#xff0c;协作效率会不会大幅提升&#xff1f;这正是 Roo Code 的“上下文提及&#xff08;Context Mentions&#xff09;”功能所要实现…