概述
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深入理解:所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复