SQL语句执行步骤:
解析–>执行步骤
执行(讲的就是在存储引擎中将数据取出来,然后进行排序,innodb引擎可以排序但myisam也可以做啊,所以排序不是在引擎层做的,而是在服务层做的,)(只有执行是在引擎中做的,其他的都是在服务层做的)
获取(排序)
InnoDB,如果没有主键,会用第一个非空且唯一的列,如果没有第一个非空且唯一的列,会建立隐藏列(6字节)
Mysql是单进程的(单进程,多线程)
能用中间键就用中间键 例如:redis
现如今Mysql主流数据库架构:主从数据库
Mysql是千万级别的数据库(每张表的存储量一般在8千万)
采用分布式数据库
主从数据库—>分布式数据库(过度)
总结: Mysql我自己能抗住的我自己扛,扛不住的用其他的中间键,单表最佳存储量式千万级别,但我可以采用分表分库,多台mysql数据库来存取一张表
学习重点: 遇到性能问题 sql语言怎么写,sql语句怎么写,这不是我们平时学习的重点,你要想提升,不是你能写多少语句,写多复杂的存储过程,你要想提升,提升的是,你要从性能层面分析出性能问题。
重点学习: 要理解一条SQL语句到Mysql里面是如何流转的
SQL语句执行过程:
最上面的倒三角是用户认证
用户模块---->命令分发器
—>(左)Query Cache Module
以下是Query Cache Module:
99.9%的情况下不开启Query Cache模块
当用户假如对一张表中五千万行数据中的一行数据进行修改时,硬盘会帮你再查一遍,这样就会产生大量的磁盘IO
MySql 5.7版本 有query cache模块
下一个版本(即未来的版本)是Mysql8.0版本 将query cache模块去掉
—>(下)Parser(解析)
Access Control Module 数据库做一个验证,你有没有权限,你能不能去查。
数据库真正的体系结构:
核心层:------>CPU和内存部分
硬盘:读数据非常慢,没电也可以用
Cpu+内存:读取快,易失,没电容易没了
存储引擎层----->硬盘
MySQL多存储引擎的原理及其对应:
2010年的时候Mysql的默认结构:MyISAM(非聚簇)(已经淘汰)
(典型的堆表)
MyISAM(非聚簇):叶子存储值和指针(不支持事务)
主键:非空且唯一
InnoDB(聚簇):主键索引上就是这个数据,叶子就是这个数据
对比: 单从访问读取速度,我们每天访问不可能只从主键访问,肯定有很多条件,会经常用到辅助索引,这样InnoDB是吃亏的。
为什么还要推行InnoDB呢?
因为MyISAM不支持事务,你要修改的话,insert,delete时,它会把你全表锁了,并发非常之低,修改一个表,只能一个人去修改。InnoDB支持行锁,增删改一行的时候,其他行是不受限制的。
Abstracted Storage Engine Module: 抽象存储引擎
整个执行过程:
Mysql没有共享池机制,一百个调取,要解析100次,但Oracle有共享池,第一个人调取的信息会放在共享池中(内存),后面有需要相同的信息的直接从共享池调取。但有很多人同时进行,这对Mysql是灾难性的。
Mysql中同时有125个active session时,就会很危险。
问题:当CPU负载特别高可能是什么原因?
答:CPU要处理SQL语句,此时的active session 可能特别多。
一张表两个文件
sql读取,先取出来这部分的信息会放在 innodb buffer pool,再想读取这个信息的会直接从innodb buufer pool读取
全表扫描的过程中,MySQL一次读取数据至少是16K,(叫做一个page(页))这16K数据有很多行数据,总这里面找7369,Tom的这个数据。如果7369这个是唯一的,那么扫描完就不扫了。如果不是唯一的,那么要将整张表都放在内存里面,然后做过滤,然后返回给数据。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)