MYSQL深入理解:
MYSQL的存储引擎:指用来存储,处理和保护数据的核心服务,也就是数据库的底层软件组织
InnoBD:是MYSQL5.1之后默认的存储引擎,支持事务,支持外健,支持崩溃修复和自增
delete drop 和truncate有什么区别?
1)delete
可用于删除表中的所有数据和部分数据,他的使用是:
delete from 表名 where+条件 order by 数字 limit 数字
我们要进行删除学生表里面数学排名最高的三个学生:
delete from student order by math desc limit 3
1)底层实现原理:在InnDB引擎里面,delete并不是真的把数据进行删除了,而是把数据打上删除标记,标记为删除状态,我们可以把MYSQL设置成非自动提交模式:
set autocommit=0;
先将第一个数据删除掉,在进行回滚操作
select * from student; +----+-----------+ | id | name | +----+-----------+ | 1 | 李佳伟 | | 2 | 李嘉欣 | | 3 | 孙文浩 | +----+-----------+ 3 rows in set (0.00 sec)mysql> set autocommit=0; Query OK, 0 rows affected (0.00 sec)mysql> delete from student; Query OK, 3 rows affected (0.00 sec)mysql> rollback; Query OK, 0 rows affected (0.00 sec)mysql> select * from student; +----+-----------+ | id | name | +----+-----------+ | 1 | 李佳伟 | | 2 | 李嘉欣 | | 3 | 孙文浩 | +----+-----------+
2)对于自增列来说,我们使用delete删除了所有的数据之后,并不会重置自增列为初始值,而是按照原来的列进行自增
DDL:数据定义域,创建一张表,删除一张表,针对表结构进行操作,定义,定义结构
DML:数据表已经通过DDL来进行了创建,但是数据没有创建,结构已经存在(DDL),但是结果中没有数据,是一种数据操纵语言
DCL:归为事务控制语言,假设该数据库引擎支持事务,提交事务
2) truncate实现原理:-------不可以进行恢复
基本用法:truncate table+表名
delete可以使用条件表达式来进行删除部分数据,但是truncate不能加条件表达式,所以他只能删除所有数据,truncate加上了where条件就会报错
实现原理:truncate看似只删除了行数据,但是它本质上是DDL语句,delete属于DML语句,因为truncate本质上是新创建了一个表结构,再把原来的表整体删除掉(原来的表结构和数据都会删除),会重置自增列
3)drop是把表结构和行数据全部进行删除------不可以进行恢复
总结它们的区别:
1)数据恢复方面:delete可以恢复删除的数据,但是truncate和drop是不能恢复删除的数据的
2)执行速度方面:从执行速度来说,delete是进行逐行执行的,并且在进行执行之后会把操作日志记录下来,以备日后进行回滚操作使用,所以说delete的执行速度是比较慢的,但是truncate实现进行复制一个表结构,再把原来的表进行删除,所以执行速度居中,但是drop执行速度最快,会删除表的索引
3)删除数据方面:drop是删除整张表,包含行数据和字段,但是truncate和drop只删除了行数据,表结构没有进行给删除
4)添加条件:delete可以使用where表达式和group by来进行使用,来进行添加查询条件,但是truncate和drop不可以添加查询条件
5)重置自增列:在InnoDB引擎中,truncate可以重置自增列,但是delete不可以
6)delete属于DML语句,但是drop和truncate属于DDL语句
聚簇索引和非聚簇索引:
在MYSQL默认存储引擎中,索引可以大致分成两类:聚簇索引和非聚簇索引
一:聚簇索引:一般指的就是主键索引,是依靠B+树来进行实现的,在聚簇索引里面叶子结点存放的是用户信息的内存地址,我们可以使用内存地址直接找到对应的行数据,存放的是行数据
1)但是聚簇索引不一定是主键索引,当你创建一张表的时候,创建了主键,那么聚簇索引就是主键索引
2)如果一张表里面没有主键,InnoDB会使用第一个唯一索引unique,况且这个唯一索引使用了非空约束,我们就是用它作为聚簇索引;
3)如果一张表既没有主键索引,又没有符合条件的唯一索引,那么InnoDB会自动生成一个一个名为gen_cllust_index的隐藏聚簇索引,是6个字节
二:非聚簇索引:非聚簇索引在InnoDB引擎里面,也叫作二级索引,我们可以看出,在非聚簇索引的叶子节点存放的并不是真正的行数据,而是主键ID,所以当我们进行使用费聚簇索引进行查询的时候,首先会得到一个主键ID,再根据主键ID去聚簇索引上面进行查询数据会得到真正的行数据,我们把这个过程称之为回表查询
所以他们的区别是:
1)聚簇索引的叶子结点存放的是行数据,而非聚簇索引的叶子结点存储的是主键ID
2)聚簇索引查询效率比较高,而非聚簇索引需要进行回表查询,所以效率上面非聚簇索引不如聚簇索引
3)聚簇索引一般是主键索引,而主键一张表上面只能有一个,因此聚簇索引一张表也只能有一个,但是非聚簇索引是可以有多个的
SQL查询语句的注意事项:
在MYSQL中,所有的SQL查询语法要遵循下面的语法顺序:
select
from
where
group by
having
order by
limit
注意:1)group by后面不可以加where语句
2)having和group by可以单独使用:
select * from student having id<5; +----+-----------+ | id | name | +----+-----------+ | 1 | 李佳伟 | | 2 | 李嘉欣 | | 3 | 孙文浩 | +----+-----------+
select * from student group by id; +----+-----------+ | id | name | +----+-----------+ | 1 | 李佳伟 | | 2 | 李嘉欣 | | 3 | 孙文浩 | | 4 | 李佳伟 | +----+-----------+select sum(id) from student group by name; +---------+ | sum(id) | +---------+ | 3 | | 5 | | 2 | +---------+
having和where有什么区别?
1)在where的使用过程中,在where语句中不可以使用select中的别名,但是使用having和group by可以使用select中的别名
1)select (chinese+math+english)/3 as avg from student having avg> 50;----成功 2)select (chinese+math+english)/3 as avg from student where avg>30;ERROR 1054 (42S22): Unknown column 'avg' in 'where clause'
2)having只能用于select语句当中,但是where可以用在任何语句中
3)having后面的字句可以搭配聚合函数来进行使用,但是where后面的字句不可以使用聚合函数
4)having通常是在分组之后进行查询,where通常是在分组之前进行查询
char和varchar有什么区别?
1)长度范围不同:char的范围是255,但是varchar的范围是65535
2)比如说要进行存储字符"abc",使用char(10),那么实际上在数据库进行存储的时候,表示存储的时候最终会占用10个字节,查询的时候会自动进行截断尾部空格,但是咱们的varchar(10)实际上进行存储的时候只会占3个字节
3)char的存取数度还是要比varchar要快得多,因为其长度固定,方便程序的存储与查找;但是char也为此付出的是空间的代价,因为其长度固定,所以难免会有多余的空格占位符占据空间,可谓是以空间换取时间效率,而varchar是以空间效率为首位的。
4)char的存储方式是,对英文字符(ASCII)占用1个字节,对一个汉字占用两个字节;而varchar的存储方式是,对每个英文字符占用2个字节,汉字也占用2个字节。
MYSQL深入理解:相关推荐
- MySQL——深入理解
前言 MySQL--深入理解主要包括MySQL的存储引擎.索引以及索引对数据库操作的性能优化.SQL优化.视图.存储过程.存储函数.触发器.锁.innoDB引擎的结构原理和数据库的相关管理操作.在这篇 ...
- 个人对于MySQL的理解_MySQL锁的理解
一.事务四要素:ACID原子性(Atomicity):要么做完,要么啥都不做,没有中间状态 一致性(Consistency):这个是个比较有争议的概念,个人理解是通过AID来保证数据正确性,保证从一个 ...
- 个人对于MySQL的理解_面试官:谈谈你对Mysql的MVCC的理解?
MVCC(Mutil-Version Concurrency Control),就是多版本并发控制.MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问. 在Mysql的In ...
- mysql全套理解以及在php中的应用
DB:数据库 DBMS:数据库管理系统(软件) SQL:用于 DB 和 DBMS 通信的语言(此为通用语言)这里主要学习 MySQL 数据库 1.开源免费 2.性能高 3.简单 4.可移植性好(可在w ...
- 浅谈mysql 平衡二叉树理解_浅析二分查找,二叉树,平衡二叉树,B树,B+树
二分查找 二分查找是最基本的,后面的二叉树,平衡二叉树,B树,B+树都是基于二分查找演变而来的. 二分查找法作为一种常见的查找方法,将原本是线性时间提升到了对数时间范围,大大缩短了搜索时间,但它有一个 ...
- mysqld,mysqld_safe,mysql.server,mysqladmin,mysql,service mysql的理解
刚接触mysql,很容易被mysqld,mysqld_safe,mysql.server,mysqladmin,mysql,service mysql弄晕 他们是命令.进程.服务.程序.脚本 最近学习 ...
- mysql 快照 理解_MySQL - 当前读和快照读
当前读和快照读 InnoDB 给每一个事务生成一个唯一事务 ID 的方法称为生成快照,因此这种场景称为快照读. 但是对于更新数据不能使用快照读,因为更新数据时如果使用快照读会可能会覆盖其他事务的更改. ...
- mysql explain理解
#1.explain中各个名称的解释: #1.1.id:查询ID id是一组数字,表示查询中执行select子句或操作表的顺序,如果id相同,则执行顺序从上至下,如果是子查询,id的序号会递增,id越 ...
- Mysql报文理解mtu拆包依据(tso/gro)
速查: tso在网卡层面拆包,gro在网卡层面拼包 ethtool -k eth0 generic-receive-offload:ethtool -K eth0 gso on tcp-segment ...
最新文章
- sources root pycharm 怎么设置_使用python语言开发ROOT之搭建环境方法探索
- let const var 比较说明
- java初始化集合_Java 中初始化 List 集合的 6 种方式!
- Libsvm分类步骤
- 内存分区与栈帧使用分析
- 宇斯盾助中厚实现TurboERP远程应用
- AOJ0028 Mode Value【出现次数最多+map+vector+水题】
- STL中的序列式容器——queue(队列)
- 2018.8.25CCPC网络赛Find Integer题解(费马大定理+勾股数的求解)
- wps自动生成目录总是有正文内容
- 上传图片到淘宝 API
- C/C++银行账户管理系统
- shiro自定义filter,anon不生效
- 云文件共享服务器,云文件共享服务器软件
- BLE 技术(八)--- BLE MESH 各层报文是如何设计的(上)?
- Android---简易Snackbar
- 专访 | 外媒看FAST:刘慈欣说的黑暗森林法则成立吗
- js实现进入页面后自动跳转到锚点
- N点标定-坐标系变换
- 咸鱼硬件—Micropython介绍
热门文章
- C语言编程>第十二周 ③ 已知学生的记录由学号和学习成绩构成,M名学生的数据已存入a结构体数组中。请编写函数fun,该函数的功能是:找出成绩最高的学生记录,通过形参返回主函数。
- 推荐算法架构2:粗排
- 16进制与byte的转换
- GEE (Google Earth Engine)高阶学习一 影像分割
- 逆向工程第006篇:简易游戏辅助的实现
- @Value读取配置文件报Could not resolve placeholder 'rabbitmq.host' in value'${rabbitmq.host}'或null的问题
- 2021-09-03 【N02】小程序开发学习笔记
- 网站是否被墙的辨别及解决方法
- 大数据:让马云化身商界福尔摩斯
- H3 BPM嵌入式流程解决方案 (文末附H3 BPM软件下载地址)