**

HashMap的底层说明:

**
我们以Java的HashMap的底层数据结构示意图讲解:

我们在Hash表中进行数据的录入或者删除时,通用步骤: 1. 基于数据的key进行hashcode计算,得到int类型的数值
2. 基于hash int值与hash表的length进行计算得到下标位置. 3. 基于数组的下标进行数据查找,若查找的下标位存在元素,再判断
该存储元素的数据结构
3. 如果存储元素是链表结构则顺序递归比对
4. 如果存储元素是红黑树则递归二分查找

不好的方面:

索引的底层数据结构为Hash表结构的话,我们在等值的匹配过程中只
需要进行基于数组的下标查找.时间复杂度为O(1)级别.但是我们也发
现在存储元素进行hashcode计算之后,原本可比较大小的多个元素
可能得到的hash int值确并不满足原本比较需求

MySQL中各大存储引擎

官网介绍. https://dev.mysql.com/doc/refman/5.7/en/storage-en
gines.html

CSV

特点:
不能定义没有索引、列定义必须为NOT NULL、不能设置自增列
CSV表的数据的存储用 “,” 隔开,可直接编辑CSV文件进行数据的编排
不适用大表或者数据的在线处理
数据安全性低
应用场景:
数据的快速导出导入
表格直接转换成CSV
我们可以直接通过文本工具打开CSV的数据表文件进行内容编排(满
足规范),通过flush table XXX;即可完成数据的编辑

Archive

特点:
压缩协议(ARZ文件格式)进行数据的存储,磁盘占用少
只支持insert和select两种操作
只允许自增ID列建立索引
应用场景:
日志采集系统
大量设备数据采集及归档
相同的数据字段和数据行数,在Myisam引擎和Innodb引擎中所占
用的大小将大的多

Memory

https://dev.mysql.com/doc/refman/5.7/en/memory-storage-en
gine.html#memory-storage-engine-characteristics-of-memory-t
ables

特点:
数据都是存储在内存中,处理效率高,表大小限定默认16M
不支持大数据存储类型的字段 如 blog,text
支持Hash索引,等值查询效率高
字符串类型强制使用char 如varchar(32) --> char(32)
数据的可靠性低,重启或系统奔溃数据丢失
应用场景:
数据热点快速加载
查询结果内存中的计算,大多数都是采用这种存储引擎作为临时
表存储需计算的数据

Myisam

特点:
较快的数据插入和读取性能
较小的磁盘占用[相较于Innodb]
支持表级别的锁,不支持事务
数据文件与索引文件分开存储[MYD和MYI]
Myisam的统计count方法可以是通过额外的常量进行返回
应用场景:
只读应用或者以读为主的业务
MySQL5.1版本之前默认存储引擎是Myisam

Innodb

特点:
支持事务
行级锁
聚集索引
数据行内容与索引结构在一个文件[IBD]
外键支持,保证数据的完整性
应用场景:
无脑选择
(MySQL5.5及版本及之后的MySQL默认存储引擎=>InoDb)
一条SQL执行的五个流程

我们把SQL执行的整个流程分为5个阶段.分别为

  • C-S的通讯阶段
  • 查询缓存阶段
  • SQL验证和优化阶段
  • 执行引擎执行阶段
  • 数据返回阶段

- 思考题

一个查询SQL语句发出去之后很久没有回应怎么办?

如果是在linux环境我们可以查看MySQL的服务端口情况.
netstat -an|grep 3306 -wc
或者使用 show full processlist 查看MySQL连接数的状态.
具体每一种状态代表的含义可通过官方文档进行查询-> https://dev.
mysql.com/doc/refman/5.7/en/general-thread-states.html
我们可找到我们发出的SQL.强制中断连接 通过 kill {id} 指令

数据连接报出Too many connections ?

show status like ‘Thread%’
Threads_cached 代表目前还有多少连接可以复用.
Threads_connected 代表目前连接到MySQL服务器的连接数
Threads_created 代表一定的时间内连接的创建量.
若你的程序没做一次查询就创建一个connection对象,有可能这
个值就会很大.
当下正在执行命令的连接.
所以可以基于分析.也可以基于实际的连接情况可以适时的调整连接
数的大小.
show variables like ‘max_conections’ 查看目前MySQL数据
库能承载的最大连接数.
set global max_connections = 1000; 这个重启服务就会失效.
或者在my.cnf 文件中进行最大连接数的修改.如果在linux系统的话,
需要考虑open file limit.具体官方文档介绍(https://dev.mysql.com/doc/refman/5.7/en/client-connections.ht
ml

step2-查询缓存

查询缓存功能和原理
在互联网初期阶段人们利用互联网只是单纯的改变浏览阅读习惯和
少量的知识内容的获取.所以很多的应用场景只存在于内容的展示和
单纯的阅读.并不像现在,我们的MySQL的优势在于OLTP系统的数据
生产.所以针对读多写少的应用场景.MySQL开发了查询缓存的功能.
此项功能在5.6版本就被MySQL默认关闭,且在MySQL8.0版本直接摒
弃.但是这个功能在SQL执行的流程中确是值得关注的一个重要环节.
查询缓存的工作原理
缓存SELECT操作的结果集和SQL语句;
基于接收的SELECT语句,先去查询缓存,判断是否存在可用的
记录集;
限制条件:
缓存失效与表数据是一致的,即表数据发生变化就缓存失效
需要手工开启. 5.6,5.7 都需要手工开启 /大多数的应用场景并不
适用
使用/判断条件苛刻 SQL语句必须完全一致,中间加上一个空格都
是缓存命中不到.
带来额外的性能消耗
查询缓存配置
query_cache_type 值:0 -– 不启用查询缓存,默认值; 值:1 -–
启用查询缓存,只要符合查询缓存的要求,客户端的查询语句和记
录集都可以缓存起来,供其他客户端使用,加上 SQL_NO_CACHE
将不缓存 值:2 -– 启用查询缓存,只要查询语句中添加了参数:
SQL_CACHE,且符合查询缓存的要求,客户端的查询语句和记录
集,则可以缓存起来,供其他客户端使用
query_cache_size 允许设置query_cache_size的值最小为40K,
默认1M,推荐设置 为:64M/128M;
query_cache_limit 限制查询缓存区最大能缓存的查询记录集,
默认设置为1M
show status like ‘Qcache%’ 命令可查看缓存情况

step3-验证优化

验证阶段
Parser会基于发送过来的SQL进行语法分析,词法分析得到一颗对应
SQL的解析树.
语法分析:验证SQL语句的语法正确性,如 恶意的字符串 ()没有正确结
束, 引号没有正确结束 返回1064
词法分析:将整条SQL语句解析成一颗解析树,基于此树结构进行表名,
字段名,函数,权限等等相关的验证.
优化阶段
基于验证阶段Parser组件生成的解析树.Optimizer(查询优化器)将通
过物理和逻辑两层优化找到最优的执行计划.
物理优化过程
使用等价变化规则
5 = 5 and a > 5 改写成 a > 5 a < b and a = 5 改写成 b > 5 and
a = 5
基于联合索引,调整条件位置等
index(a,b,c) SQL where a =xx and c =ddd
EX:
explain select * from customer where last_name =
‘ANDERSON’ and first_name = ‘LISA’;
逻辑优化过程
优化count,min,max等相关函数
min优化基于B+Tree的索引,只需要查询对应的索引叶子节点的
最左端记录即可.
max优化基于B+Tree的索引,只需要查询对应的索引叶子节点的
最右端记录即可.
explain select min(customer_id) from customer;
count函数,在Myisam引擎中,表记录行数是以常量的方式保存的.
针对Myisam引擎的count查询,只需要查询该常量即可.
explain select count(*) from user_myisam;
通过Explain这些类型的SQL语句,会发现,在Extra的列中显示
Select tables optimized away .
表示 优化器针对这个SQL的优化采用常数取而代之
覆盖索引扫描优化
如果查询语句的列字段可以通过索引信息直接返回,则无需回表
进行二次查询.
explain select name from user_innodb where name like
‘hello-123456%’ ;
在对应的Extra信息我们发现有Using index 的额外信息,表示该
SQL采用索引进行数据的返回.
冗余子查询的优化
explain select * from (select * from user_innodb
where id =1111) as T
提前终止查询
在发现已经满足查询需求时,MySQL能够立刻终止查询.
这种立刻终止查询主要体现在两种场景:
limit子句,查询10条数据,一旦发现满足了10条就立刻终止查

第二种场景逻辑上不成立的查询条件.若 id列最小值为1
where id =-1 这样的条件.
explain select * from user_innodb where id = -1 \G
上图中Extra中提示no matching row in const table
in的条件优化
总而言之,在优化器的逻辑优化阶段,MySQL的查询优化器是基于成
本计算的原则。他会去尝试各种执行计划。并进行抽样数据的方式
进行试验. 优化器的抽样:采用随机的读取一个4K的数据块进行分
析。

key_len

标识使用到的索引列长度.
计算公式:
varchr(10) 变长字段且允许NULL = 10 * (utfmb4=3
utf8=3,gbk=2,latin1=1)+1(NULL)+2(变长字段)
explain select userName from exp_user \G
explain select * from exp_user \G
varchr(10)变长字段且不允许NULL = 10 *(utfmb4=3
utf8=3,gbk=2,latin1=1)+2(变长字段)
char(10)固定字段且允许NULL = 10 * (utfmb4=4
utf8=3,gbk=2,latin1=1)+1(NULL)
char(10)固定字段且不允许NULL = 10 * (utfmb4=4
utf8=3,gbk=2,latin1=1)
上诉的判断公式,是判断一个联合索引使用列的重要依据.

数据库-20210719(随手记)相关推荐

  1. 系统运维系列 之Clickhouse数据库学习集锦(增删改查操作)

    1 简介 本篇内容涉及一些增删改查操作,包括数据库.表,重点介绍字段的增加/删除操作,其中包含的内容均实际测试通过. 2 Clickhouse clickhouse是一款MPP架构的列式存储数据库,它 ...

  2. Spring Boot参考指南

    Spring Boot参考指南 作者 菲利普·韦伯,戴夫 Syer,约什 长,斯特凡 尼科尔,罗布 绞车,安迪·威尔金森,马塞尔 Overdijk,基督教 杜普伊斯,塞巴斯蒂安·德勒兹,迈克尔·西蒙斯 ...

  3. 第八节_我的日记本开发手记(8)——sqlite数据库与c#

    一.SQLite介绍 (一)基本介绍 1. 数据库(database,DB):一个以某种有组织的方式存储的数据集合.数据库中的数据按一定的数学模型组织.描述和存储,具有较小的冗余,较高的数据独立性和易 ...

  4. mysql 还原数据库 unknown command 'b',mysql数据库还原出错ERROR:Unknown command '\'解决手记 | 点滴之间 聚沙成金...

    使用mysql命令行客户端,使用source导入备份文件,但导入中出错, ERROR: Unknown command '\\'. ERROR: Unknown command '\". E ...

  5. SQLite数据库安装、试用及编程测试手记http://www.ywtaoke.cn/ 皇冠店铺女装

    SQLite数据库安装.试用及编程测试手记 转的 http://www.ywtaoke.cn/  淘客网 今天,试用了一下SQLite数据库,并简单地进行了一下数据表记录增.删.修改的编程测试,现将试 ...

  6. mysql 单实例部署_Mysql 数据库单机多实例部署手记

    最近的研发机器需要部署多个环境,包括数据库.为了管理方便考虑将mysql数据库进行隔离,即采用单机多实例部署的方式. 找了会资料发现用的人也不是太多,一般的生产环境为了充分发挥机器性能都是单机单实例运 ...

  7. php仿tp5实现模型,php手记之05-tp5模型操作数据库

    #实例化模型 // $user = new User; // $user1 = new User(); // $user2 = model('user'); // 添加一条数据 #方法1 // $us ...

  8. [转载] 数据库分析手记 —— InnoDB锁机制分析

    作者:倪煜 InnoDB锁机制常常困扰大家,不同的条件下往往表现出不同的锁竞争,在实际工作中经常要分析各种锁超时.死锁的问题.本文通过不同条件下的实验,利用InnoDB系统给出的各种信息,分析了锁的工 ...

  9. 数据工程师妹子养成手记——数据库篇

    这篇文章没有代码,请放心阅读. 程序员最宝贵的东西是生命,生命属于程序员只有一次.一个程序员的一生应该这样度过:当她回首往事的时候,她不会因为搭建环境浪费时间而悔恨,也不会因为集群无法运行而羞耻.这样 ...

最新文章

  1. iPhone Three20软件引擎之构建开发环境与HelloWorld
  2. 集体奔赴农业战场 互联网巨头对话中国农民丰收节交易会
  3. 【转】分布式一致性算法:Raft 算法(Raft 论文翻译)
  4. bat批处理延迟运行脚本
  5. ios 秒数转化为时间_iOS UTC秒数时间戳和日期的相互转换【原创】
  6. C++中变量使用前一定要初始化
  7. 学习Android MediaPlayer
  8. 2016蓝桥杯省赛---java---B---3(凑算式)
  9. html%2b怎么转换成加号,Apache mod_rewrite%2B和加号(+)符号
  10. Android安全问题 钓鱼程序
  11. 淘宝面试-Strcpy与memcpy两函数的经典实现
  12. vue img标签无图片显示默认图片效果
  13. Python数据库编程练习 ※
  14. HTML5期末大作业:关于家乡介绍主题网页设计——云南民族文化(8页) HTML+CSS+JavaScript 期末作业HTML代码 学生网页课程设计期末作业下载 web网页设计制作成品
  15. 解决ubuntu16.04插耳机没有声音的问题
  16. Linux动态链接库.so文件的命名及用途总结
  17. iOS调用手机振动和铃声
  18. ICLR2020国际会议精彩演讲抢先看(含源码)!!
  19. 拼团模式--社交电商的常见营销手法
  20. 毕业设计说明书(论文)结构-系统设计方面

热门文章

  1. 实现复数类中的运算符重载(含有double类型)
  2. NET Framework合集
  3. 《5G时代:生活方式和商业模式的大变革》读书笔记和总结
  4. 人生感悟--条条经典
  5. python程序员搞笑表情包_几十个程序员扎心的瞬间—必存表情包系列
  6. 用手机UC浏览器页面打开vue项目,图片,css,js都没加载
  7. 网络语言c三个字猫头鹰,在线语言学习平台 多邻国(Duolingo)更新猫头鹰图标...
  8. [PC] 2015 僵尸 ZOMBI
  9. Android插件化换肤
  10. 空洞骑士复活歌女玛丽莎的方法(复活其他灵魂NPC同理)