InnoDB

一条 sql 的执行过程详解

自古美人都是妖i 提交于 2020-12-31 01:18:35
感谢关注 趣学程序 !公众号内部回复 666 获取 热门教程 写操作执行过程    如果这条sql是写操作(insert、update、delete),那么大致的过程如下,其中引擎层是属于 InnoDB 存储引擎的,因为InnoDB 是默认的存储引擎,也是主流的,所以这里只说明 InnoDB 的引擎层过程。由于写操作较查询操作更为复杂,所以先看一下写操作的执行图。方便后面解析。 0x01: 组件介绍 Server层 1、连接器   1)负责与客户端的通信,是半双工模式,这就意味着某一固定时刻只能由客户端向服务器请求或者服务器向客户端发送数据,而不能同时进行。   2)验证用户名和密码是否正确(数据库mysql的user表中进行验证),如果错误返回错误通知(deAcess nied for user 'root'@'localhost'(using password:YES)),如果正确,则会去 mysql 的权限表(mysql中的 user、db、columns_priv、Host 表,分别存储的是全局级别、数据库级别、表级别、列级别、配合 db 的数据库级别)查询当前用户的权限。 2、缓存(Cache)   也称为查询缓存,存储的数据是以键值对的形式进行存储,如果开启了缓存,那么在一条查询sql语句进来时会先判断缓存中是否包含当前的sql语句键值对,如果存在直接将其对应的结果返回

MySQL(笔记)

杀马特。学长 韩版系。学妹 提交于 2020-12-30 11:34:28
数据库总览 有时候查的数据错乱,可以重启MySQL 关系型数据库 ( SQL ) MySQL , Oracle , SQL Server , SQLite , DB2 , … 关系型数据库通过外键关联来建立表与表之间的关系 非关系型数据库 ( NOSQL )not only Redis , MongoDB , … 非关系型数据库通常指数据以对象的形式存储在数据库中,而对象之间的关系通过每个对象自身的属性来决定 DBMS 数据库管理系统 ( D ata B ase M anagement S ystem ) 数据库管理软件 , 科学组织和存储数据 , 高效地获取和维护数据 MySQL应该算是一个数据库管理系统. 特点 : 免费 , 开源数据库 小巧 , 功能齐全 使用便捷 可运行于Windows或Linux操作系统 可适用于中小型甚至大型网站应用 官网 : https://www.mysql.com/ 安装步骤 1、下载后得到zip压缩包. 2、解压到自己想要安装到的目录,本人解压到的是D:\Environment\mysql-5.7.19 3、添加环境变量:我的电脑->属性->高级->环境变量 选择PATH,在其后面添加: 你的mysql 安装文件下面的bin文件夹 4、编辑 my.ini 文件 ,注意替换路径位置 [mysqld] basedir=D:\Program Files

2020年MySQL数据库面试题总结(50道题含答案解析)

独自空忆成欢 提交于 2020-12-30 10:08:51
开源Linux 长按二维码加关注~ 上一篇: 收藏:详解交换机基础知识 1、MySQL 中有哪几种锁? (1)表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最 高,并发度最低。 (2)行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最 低,并发度也最高。 (3)页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表 锁和行锁之间,并发度一般。 2、MySQL 中有哪些不同的表格? 共有 5 种类型的表格: (1)MyISAM (2)Heap (3)Merge (4)INNODB (5)ISAM 3、简述在 MySQL 数据库中 MyISAM 和 InnoDB 的区别 MyISAM: (1)不支持事务,但是每次查询都是原子的; (2)支持表级锁,即每次操作是对整个表加锁; (3)存储表的总行数; (4)一个 MYISAM 表有三个文件:索引文件、表结构文件、数据文件; (5)采用非聚集索引,索引文件的数据域存储指向数据文件的指针。辅索引与主索引基本一致,但是辅索引不用保证唯一性。 InnoDb: (1)支持 ACID 的事务,支持事务的四种隔离级别; (2)支持行级锁及外键约束:因此可以支持写并发; (3)不存储总行数: (4)一个 InnoDb 引擎存储在一个文件空间(共享表空间,表大小不受操作系统控制,一个表可能分布在多个文件里

2020年MySQL数据库面试题总结(50道题含答案解析)

醉酒当歌 提交于 2020-12-30 10:08:36
1、MySQL 中有哪几种锁? (1)表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最 高,并发度最低。 (2)行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最 低,并发度也最高。 (3)页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表 锁和行锁之间,并发度一般。 2、MySQL 中有哪些不同的表格? 共有 5 种类型的表格: (1)MyISAM (2)Heap (3)Merge (4)INNODB (5)ISAM 3、简述在 MySQL 数据库中 MyISAM 和 InnoDB 的区别 MyISAM: (1)不支持事务,但是每次查询都是原子的; (2)支持表级锁,即每次操作是对整个表加锁; (3)存储表的总行数; (4)一个 MYISAM 表有三个文件:索引文件、表结构文件、数据文件; (5)采用菲聚集索引,索引文件的数据域存储指向数据文件的指针。辅索引与主索引基本一致,但是辅索引不用保证唯一性。 InnoDb: (1)支持 ACID 的事务,支持事务的四种隔离级别; (2)支持行级锁及外键约束:因此可以支持写并发; (3)不存储总行数: (4)一个 InnoDb 引擎存储在一个文件空间(共享表空间,表大小不受操作系统控制,一个表可能分布在多个文件里),也有可能为多个(设置为独立表空,表大小受操作系统文件大小限制,一般为

2020年度总结了这 50 道 MySQL 高频面试题!

那年仲夏 提交于 2020-12-30 09:01:16
1、一张表,里面有ID自增主键,当insert了17条记录之后,删除了第15,16,17条记录,再把Mysql重启,再insert一条记录,这条记录的ID是18还是15 ? 2、Mysql的技术特点是什么? Mysql数据库 软件是一个客户端或服务器系统,其中包括:支持各种客户端程序和库的多线程SQL服务器、不同的后端、广泛的应用程序编程接口和管理工具。 3、Heap表是什么? HEAP表存在于内存中,用于临时高速存储。 BLOB或TEXT字段是不允许的 只能使用比较运算符=,<,>,=>,= < HEAP表不支持AUTO_INCREMENT 索引不可为NULL 4、Mysql服务器默认端口是什么? Mysql 服务器的默认端口是3306。 5、与Oracle相比,Mysql有什么优势? Mysql是开源软件,随时可用,无需付费。 Mysql是便携式的 带有命令提示符的GUI。 使用Mysql查询浏览器支持管理 6、如何区分FLOAT和DOUBLE? 以下是FLOAT和DOUBLE的区别: 浮点数以8位精度存储在FLOAT中,并且有四个字节。 浮点数存储在DOUBLE中,精度为18位,有八个字节。 7、区分CHAR_LENGTH和LENGTH? CHAR_LENGTH是字符数,而LENGTH是字节数。Latin字符的这两个数据是相同的,但是对于Unicode和其他编码,它们是不同的

delete、truncate、drop,千万别用错了。。

耗尽温柔 提交于 2020-12-29 15:53:51
上周同事小姐姐问我:“哈哥你看,我发现MySQL有bug,我下午为了清理磁盘,明明删除了100万条MySQL数据,磁盘不仅没有变小,反而更满了呢??” 那你是怎么删除的? “delete from table 呀” “怪不得,其实要删除MySQL数据是有好几种方式的,有些场景下是不应该用DELETE的,比如你这种情况。好了,让我来给你讲一下吧。” MySQL删除数据的方式都有哪些? 咱们常用的三种删除方式:通过 delete、truncate、drop 关键字进行删除;这三种都可以用来删除数据,但场景不同。 一、从执行速度上来说 drop > truncate >> DELETE 二、从原理上讲 1、DELETE DELETE from TABLE_NAME where xxx 1、DELETE属于数据库DML操作语言,只删除数据不删除表的结构,会走事务,执行时会触发trigger; 2、在 InnoDB 中,DELETE其实并不会真的把数据删除,mysql 实际上只是给删除的数据打了个标记为已删除,因此 delete 删除表中的数据时,表文件在磁盘上所占空间不会变小,存储空间不会被释放,只是把删除的数据行设置为不可见。虽然未释放磁盘空间,但是下次插入数据的时候,仍然可以重用这部分空间(重用 → 覆盖)。 3、DELETE执行时,会先将所删除数据缓存到rollback

php面试专题---15、MySQL数据库基础考察点

会有一股神秘感。 提交于 2020-12-29 10:54:10
php面试专题---15、MySQL数据库基础考察点 一、总结 一句话总结: 注意:只写精品 1、mysql定义int(3),那么我存1234就错了么? 不是:无影响:只会影响显示字符的个数:可以为整数类型指定宽度,例如:INT(11)、对大多数应用是没有意义的,它不会限制值的合法范围,只会影响显示字符的个数 int(3)的意义:如果我们是12,又设置了zerofill,那么mysql自动为我们填充为012 2、mysql中FLOAT、DOUBLE、DECIMAL注意 ? 1、DECIMAL可存储比BIGINT还大的整数;可以用于存储精确的小数 2、FLOAT和DOUBLE类型支持使用标准的浮点进行近似计算:比DECIMAL效率高 3、varchar存储实质? 额外字节记录长度:VARCHAR使用1或2个额外字节记录字符串的长度,列长度小于255字节,使用1个字节表示,否则用2个 截断:VARCHAR长度,如果存储内容超出指定长度,会被截断 4、char使用注意? 空格填充比较:CHAR会根据需要采用空格进行填充以方便比较 截断:CHAR长度,超出设定的长度,会被截断 CHAR是定长的,根据定义的字符串长度分配足够的空间 空格填充比较:CHAR会根据需要采用空格进行填充以方便比较 CHAR适合存储很短的字符串,或者所有值都接近同一个长度 截断:CHAR长度,超出设定的长度,会被截断

mysql之sql性能调优

感情迁移 提交于 2020-12-29 07:51:48
sql调优大致分为两步:1 如何定位慢查询 2 如何优化sql语句。 一:定位慢查询 -- 显示到mysql数据库的连接数 -- show status like 'connections'; -- 显示慢查询次数 show status like ' slow_queries ' ; -- 查看慢查询阈值 (默认是10秒) show variables like ' long_query_time ' ; -- 修改慢查询时间 (但是重启mysql之后,long_query_time依然是my.ini中的值) set long_query_time = 1 ; -- 此时再次查看mysql慢查询阈值就是刚设置的值了,一般sql执行时间超过1s,就是慢查询了。 如图:我们将慢查询时间设置为0.004s, 而select * from aaa; 执行花了0.005s,那么它就是慢查询,mysql会将慢查询语句直接写入日志文件中,我们就可以根据日志快速定位项目中的慢查询语句。 二:优化案例   查询只有命中索引才能高效,我们可以通过 explain 执行计划 来检查我们的sql语句是否命中了索引。 1 :创建表, id为主键索引 CREATE TABLE ccc ( id int ( 5 ), name varchar ( 50 ), age int ( 3 ), PRIMARY

2020-12-26:mysql中,表person有字段id、name、age、sex,id是主键,name是普通索引,age和sex没有索引。select * from person where i

夙愿已清 提交于 2020-12-28 09:34:36
2020-12-26:mysql中,表person有字段id、name、age、sex,id是主键,name是普通索引,age和sex没有索引。select * from person where id=1 and name=‘james’ and age=1 and sex=0。请问这条语句有几次回表? 福哥答案2020-12-26: 答案是没有回表。 一般题目是判断有没有回表,而这道题是要说出有几次回表。 刚开始以为会用到回表。后来想了想,没有回表。id是等值查询,顶多命中1条数据。然后再对这1条数据做name过滤,就这么1条数据,没必要回表查询,连我都能想到,mysql的作者更能想到,mysql没那么傻。 有什么不对的地方,请直接留言评论。 1.创建表和插入数据: – Table structure for person 表结构 DROP TABLE IF EXISTS person ; CREATE TABLE person ( id int(11) NOT NULL, name varchar(255) NOT NULL, age int(11) NOT NULL, sex tinyint(4) NOT NULL, PRIMARY KEY ( id ), KEY name ( name ) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; –

mysql数据库基本操作说明

泄露秘密 提交于 2020-12-27 03:44:37
登陆: mysql -uroot -p 查看数据库列表: show databases; 更改访问的数据库: use test; 查看数据表列表: show tables; 建用户: CREATE USER test@'192.168.0.11' IDENTIFIED BY '123123'; 赋权限: grant all privileges on *.* to test@'192.168.1.11' identified by '123123' 收回权限: REVOKE INSERT ON PERSON.* FROM test@'192.168.0.11'; 改密码: use mysql; UPDATE user SET password=PASSWORD('输入新密码') WHERE user='用户名'; 删除用户: DROP USER test@'192.168.0.11'; 查看用户权限: show grants for 'root'@'192.168.1.102'; 查看数据库服务innodb引擎运行状态: show engine innodb status\G; 查看数据库属性配置: show VARIABLES like '%%'; 查看数据库状态: show status like '%Aborted_clients%'; 建库: CREATE DATABASE