mysql的一些底层学习

news2024/11/18 8:51:28

数据库三大范式

1、第一范式:确保每列保持原子性

2、第二范式:确保表中每列都与主键列相关

3、第三范式:确保表中每列都与主键列直接相关而不是间接相关

不要一味的去追求符合范式要求,实际项目中,需求 > 性能 > 表结构

索引底层原理

show global status like 'Innodb_page_size';

可以查询到每个节点中,mysql允许的最大大小,默认16kb

索引是帮助mysql高效获取数据的排好序数据结构

索引的数据结构分为:二叉树  红黑树   hash表     b-tree

其中二叉树 红黑树的数据结构在  java 集合总结篇做过介绍

CSDN

在没有索引的情况下,执行select * from table where id = 1的语句,就会全表扫描,一行一行的匹配,然后对结果进行返回,如果数据量级比较大的情况,就会十分影响效率。 

给id字段加了索引之后,在此执行该语句的时候,知道id为索引字段,就会根据索引的数据结构进行查找,比如说,二叉树的查找,红黑树的查找,就会比没有索引的线性查找快很多。当然,这两种数据结构也是有弊端的,比如说二叉树不够平衡,所以出现了红黑树,也叫二叉平衡树,红黑树因为在插入删除时要维护树结构,所以也会对效率造成影响,同时,如果使用这两种树结构来进行存储,当有大数据量,比如100万条,树就会很高,因为数据库的数据是存储在磁盘上的,因此每次进行查询,就会对磁盘进行一次io操作,所以这两种结构都不合适。

hash表结构,就类似于jdk1.8之前的hashmap底层,数组+链表,这种数据结构不提供范围查询的方式,如果说where name = 'zhangsan',会根据zhangsan计算出来索引值,并不是一个排序好的范围,所以不适合作为索引的底层。

b+tree结构,叶子节点包含了所有的索引,并且每个节点直接维护有指针指向下一节点,这样

因此,mysql的索引使用的是b+tree,具体b+tree和b-tree的区别,后面进行介绍。

b-tree

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FhYTk0ODc3MTg1NA==,size_16,color_FFFFFF,t_70

1、叶节点具有相同的深度,叶节点的指针为空

2、所有索引元素不重复

3、节点中的数据索引从左到右递增排序 

这种结构,实际上是对红黑树的一种改造,使根节点同时有多个,中间有空隙,每个节点上带有数据,匹配到之后进行返回,这种结构可以控制树的高度,比方说查到id = 20的数据,首先进入根节点,判断得到20在15到56之间,往下找,找到20,因为节点中的数据索引都是递增的,所以到达最后一个分支的时候,查询效率也是较高的,最后返回data完事。但是每个索引处,都存放有data,数据量大的情况下,这种结构并不能支撑起太多的数据量级。但是对于范围查找的支持并不好。

 

b+tree (b-tree变种)

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FhYTk0ODc3MTg1NA==,size_16,color_FFFFFF,t_70

1、非叶子节点不存储data,只存储索引(冗余),这样可以存放更多的索引

2、叶子节点包含所有索引字段

3、叶子节点用指针连接,提高区间访问的性能

b+tree结构,所有的非叶子节点都没有data,这样可以使树可以存放更多的索引,先找到索引,再去叶子节点处查找data,非叶子节点都是要加载到内存的,带上data会浪费内存。有了冗余的索引元素,这样可以让所有的索引元素的存放到非叶子节点。主键即使是使用bigint,只占8byte的空间,16kb/8byte,就可以存下千万级的数据量。

 

mysql的存储引擎

常用的有MyISAM和InnoDB,是形容表的,数据库也可以设置,但是最终取决于表,默认InnoDB

MyISAM 

它不支持事务,也不支持外键,尤其是访问速度快

InnoDB

InnoDB是一个健壮的事务型存储引擎,这种存储引擎已经被很多互联网公司使用,为用户操作非常大的数据存储提供了一个强大的解决方案。InnoDB还引入了行级锁定和外键约束

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FhYTk0ODc3MTg1NA==,size_16,color_FFFFFF,t_70

数据库的数据存储在磁盘上,data目录下,每个文件夹都是一个数据库实例

MyISAM:

单张表对应在磁盘上的文件有三个,.frm、.MYD、.MYI,分别存储着表结构,表中的数据,表中的索引,这种引擎的具体查找过程如下: 

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FhYTk0ODc3MTg1NA==,size_16,color_FFFFFF,t_70

InnoDB:

单张表对应在磁盘上的文件有两个,.frm、.ibd,分别存储着表结构、表数据和索引(在一个文件中)

1)表数据文件本身就是按b+tree组织的一个索引结构文件

2)聚集索引 - 叶节点包含了完整的数据记录

3)为什么InnoDB表必须有主键,并且推荐使用整型的自增主键

没有主键,没有办法以b+tree的数据结构来组织数据,如果没有主键,会去扫描表中各个字段,如果有内容都不一样的字段,就会被设置为主键,如果不存在这样的字段,mysql会自动维护一个主键索引,因为数据库的资源十分珍贵,所以最好自己建一个主键。整型更好比较,因为b+tree底层是排好序的数据,使用自增的整型主键就可以直接往后面添加,不会重新排序,造成节点分裂。不自增的话还可能会有一个树平衡的操作,就会造成性能开销。

4)为什么非主键索引结构叶子节点存储的是主键值?

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FhYTk0ODc3MTg1NA==,size_16,color_FFFFFF,t_70

 区别在于叶子节点,存储着完整的数据

InnoDB主键索引就是一个聚集索引,索引和数据分开存储就是非聚集索引,ibd = MYI+MYD

 

联合索引

联合索引的排序规则是从左至右,第一个字段进行排序,然后第二个,第三个....

sql优化

1、最左前缀法则

2、不在索引列上做任何操作(计算、函数、自动或者手动类型转换),会导致索引失效而转向全表扫描

3、mysql在使用不等于 != 或者<> 的时候,无法使用索引,会导致全表扫描

4、is null、is not null一般情况下也是无法使用索引的

5、like以通配符开头 ,mysql索引也会失效,变为全表扫描操作

6、尽量只访问索引列,减少select *

 

Linux安装mysql

和其他数据库相比,MySql有点与众不同,他的架构可以在多种不同场景中应用并发挥良好的作用,主要体现在存储引擎的架构上,插件式的存储引擎架构将查询处理和其他的系统任务以及数据的存储提取相分离。这种架构可以根据业务的需求和实际需要选择合适的存储引擎。

检查本机是否安装过mysql: rpm -qa|grep -i mysql

安装mysql服务端:rpm -ivh Mysql-server..... .rpm

安装mysql客户端:rpm -ivh Mysql-client..... .rpm

20210810113405587.png

 安装好之后,会提示说,创建了一个root最高权限账户root,但是没有密码,需要自己去设置密码

判断mysql是否安装成功:

1、查看mysql安装时创建的mysql用户和mysql组

cat /etc/passwd|grep mysql
mysql:x:101:103:MySQL server:/var/lib/mysql:/bin/bash
cat /etc/group|grep mysql
mysql:x:103:

2、可以查看版本信息

mysqladmin --version

 

启动mysql

service mysql start/stop

查看mysql进程

ps -ef|grep mysql

 

直接输入mysql,即可引入命令行,因为mysql默认没有设置密码,所以直接进去了,exit,按照安装时提示的命令,进行设置密码,再次要进入命令行时需要下面命令:

mysql -u root -p    输入正确的密码后即可进入

chkconfig mysql on

可以通过 ntsysv 命令查看是否设置成开机后自启动

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FhYTk0ODc3MTg1NA==,size_16,color_FFFFFF,t_70

 装完记得修改字符集编码。

通过 show variables like 'character%' ;   可以查看字符集编码格式

拷贝一份配置文件

cp /usr/share/mysql/my-huge.cnf    /etc/my.cnf   (5.5版本)

5.6版本叫 my-default.cnf

修改字符集编码

[client]
default-character-set=utf8
[mysqld]
character_set_server=utf8
character_set_client=utf8
collation-server=utf8_general_ci
[mysql]
default-character-set=utf8

设置字符集之前创建的表,插入数据还是会乱码,新建的表不会乱码,所以一定要在安装完之后就进行设置。

 

 

 

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

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

相关文章

GPT-3(Language Models are Few-shot Learners)简介

GPT-3(Language Models are Few-shot Learners) GPT-2 网络架构 GPT系列的网络架构是Transformer的Decoder&#xff0c;有关Transformer的Decoder的内容可以看我之前的文章。 简单来说&#xff0c;就是利用Masked multi-head attention来提取文本信息&#xff0c;之后利用MLP和…

内嵌于球体的多边形

( A, B )---2*30*2---( 1, 0 )( 0, 1 ) 做一个网络让输入只有2个节点&#xff0c;每个训练集里有两张图片&#xff0c;让B的训练集全为0&#xff0c;排列组合A&#xff0c;观察迭代次数平均值的变化。 共得到32组数据&#xff0c; 差值结构 A-B 迭代次数 1 1 3*2*0*0 104…

计算机网络学习笔记(二)物理层

物理层&#xff08;传输比特0/1&#xff09;基本概念 物理层下的传输媒体 1. 导引型 同轴电缆&#xff0c;双绞线&#xff08;绞合可抵御干扰&#xff09;&#xff0c;光纤&#xff0c;电力线 2. 非导引型&#xff08;调制振幅 频率 相位&#xff09; 无线电波&#xff0c;微…

SpringBoot整合MybatisPlus(powernode CD2207)(内含教学视频+源代码)

SpringBoot整合MybatisPlus&#xff08;powernode CD2207&#xff09;&#xff08;内含教学视频源代码&#xff09; 教学视频源代码下载链接地址&#xff1a;https://mp.csdn.net/mp_download/manage/download/UpDetailed 目录SpringBoot整合MybatisPlus&#xff08;powernode…

项目搭建规范

一. 代码规范 1.1. 集成editorconfig配置 EditorConfig 有助于为不同 IDE 编辑器上处理同一项目的多个开发人员维护一致的编码风格。 # http://editorconfig.org root true [*] # 表示所有文件适用 charset utf-8 # 设置文件字符集为 utf-8 indent_style space # 缩进…

数据结构 - 栈 与 队列 - (java)

前言 本篇介绍栈和队列&#xff0c;了解栈有顺序栈和链式栈&#xff0c;队列底层是双链表实现的&#xff0c;单链表也可以实现队列&#xff0c;栈和队列的相互实现和循环队列&#xff1b;如有错误&#xff0c;请在评论区指正&#xff0c;让我们一起交流&#xff0c;共同进步&a…

Splashtop:支持M1/M2芯片 Mac 电脑的远程控制软件

M1和M1芯片的Mac电脑现在越来越多了。M1和M2的强大性能&#xff0c;让使用者们办公、娱乐如虎添翼。 M1 芯片于2020年11月11日推出&#xff0c;是Apple 首款专为Mac打造的芯片&#xff0c;拥有格外出色的性能、众多的功能&#xff0c;以及令人惊叹的能效表现。M1 也是Apple 首款…

Docker搭建MySQL主主模式+Keepalived实现高可用集群

1.环境准备&#xff1a; 系统版本 Centos7 IP&#xff1a;10.10.11.79 master IP&#xff1a;10.10.11.80 backup 虚拟ip&#xff1a;10.10.11.82 Docker环境&#xff1a; centos7离线安装docker&#xff0c;docker-compose keepalived安装包&#xff1a; https://www.k…

设计模式之原型模式与建造者模式详解和应用

目录1 原型模式1.1 原型模式定义1.2 原型模式的应用场景1.3 原型模式的通用写法&#xff08;浅拷贝&#xff09;1.4 使用序列化实现深度克隆1.5 克隆破坏单例模式1.6 原型模式在源码中的应用1.7 原型模式的优缺点1.8 总结2 建造者模式2.1 建造者模式定义2.2 建造者模式的应用场…

自动化测试基础概念

前端自动化测试相关概念&#xff08;单元测试、集成测试、E2E 测试、快照测试、测试覆盖率、TDD 以及 BDD 等内容&#xff09;&#xff0c;以及测试框架 Jest 的讲解&#xff0c;Vue.js 应用测试&#xff0c;React 应用测试&#xff0c;E2E 测试&#xff0c;Node.js 应用测试等…

操作系统(三):内存管理,分页地址映射,页面置换算法LRU,NRU,FIFO,第二次机会算法和时钟算法

文章目录一、虚拟内存二、分页系统地址映射三、页面置换算法最佳置换算法LRU 最近最久未使用算法NRU 最近未使用FIFO 先进先出第二次机会算法时钟算法四、内存分段五、段页式六、分页和分段的比较一、虚拟内存 虚拟内存的目的是为了让无力内存扩充成更大的逻辑内存&#xff0c…

手工测试怎样找到第一份自动化测试的工作?

你会手工测试了&#xff0c;那么准备再找自动化测试的工作&#xff0c;相对于什么都不懂的小白来说优势很大。要找自动化测试的工作&#xff0c;首先你要会自动化测试&#xff0c;你要会编程&#xff0c;能写自动化测试脚本的语言有很多&#xff0c;你可以自己选择一门&#xf…

求职笔记记录

求职笔记记录目录概述需求&#xff1a;设计思路实现思路分析1.面试过程参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,challenge Survive.…

tofu:一款功能强大的模块化Windows文件系统安全测试工具

关于tofu tofu是一款功能强大的针对Windows文件系统安全的模块化工具&#xff0c;该工具可以使用离线方法对目标Windows文件系统进行渗透测试&#xff0c;并通过绕过Windows系统登录界面来帮助广大研究人员测试Windows主机的安全性。除此之外&#xff0c;该工具还可以执行哈希…

Python学习笔记 --- 初识Python

编译器和解释器 概念&#xff1a; 可以把编译器和解释器理解成是人与计算机之间的 “翻译”&#xff0c;将代码翻译成计算机能够识别的指令。 编译器&#xff1a;全文翻译&#xff0c;拿到代码会将其编译成一个计算机能够识别的临时文件&#xff0c;再把文件交给操作系统读取…

SpringMVC(3)

通过上面的学习我们知道&#xff0c;默认情况下无论是Spring MVC还是SpringBoot返回的都是现在都是前后端分离的&#xff0c;后端只需要进行返回数据给前端数据即可 1)向浏览器返回一个HTML界面 请求参数的数据类型Contnt-Type:text/html&#xff1b;charsetutf-8 RequestMapp…

Linux centos、麒麟V10 安装redis

目录 1、下载redis安装包 2、将下载后的.tar.gz压缩包上传到到服务器自定义文件夹下 3、 解压文件 4、安装redis 5、配置redis.conf 6、启动redis 1、下载redis安装包 Redis各版本下载&#xff1a;https://download.redis.io/releases/ 2、将下载后的.tar.gz压缩包上传到…

用主动游泳的三维水母模型量化美杜莎的(medusan)机械空间的性能(二)(2017)

文章目录用主动游泳的三维水母模型量化美杜莎的&#xff08;medusan&#xff09;机械空间的性能&#xff08;二&#xff09;(2017)原文链接&#xff1a;https://doi.org/10.1017/jfm.2017.3结果3.1 参考案例的游泳动力学3.2 改变钟的主动和被动材料属性3.2.1 改变施加的张力3.2…

【并发编程】【1】概览

并发编程 1. 概览 1.1 这门课讲什么 这门课中的【并发】一词涵盖了在Java平台上的 进程线程并发并行 以及Java并发工具&#xff0c;并发问题以及解决方案&#xff0c;同时也会包含一些其他领域的开发 1.2 为什么学这么课程 我工作中用不到并发啊&#xff1f; 1.3 课程特…

qemu的snapshot快照功能的详细使用介绍

快照功能还是蛮有趣的&#xff0c;就是资料比较少&#xff0c;这边万能菜道人特意整理了一下。参考内容&#xff1a;QEMU checkpoint(snapshot) 使用-pudn.comKVM&QEMU学习笔记&#xff08;二&#xff09;-蒲公英云 (dandelioncloud.cn)在线迁移存储 - 爱码网 (likecs.com)…