我是靠谱客的博主 爱笑夕阳,最近开发中收集的这篇文章主要介绍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深入理解:所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部