OLTP和OLAP
MySql是一个传统的RDBM数据库,也就是关系型数据库,广泛应用于OLTP场景
OLTP(联机事务处理)是传统的关系型数据库的主要应用,用于基本的日常的事务处理,例如银行的交易记录;
而OLAP(联机分析处理)是数据仓库系统的主要应用,支持复杂的分析操作,侧重决策支持,并且提供了直观易懂的查询结果,最常见的应用就是复杂的动态报表系统
总体来说OLTP用于日常处理,OLAP用于数据分析
数据库三大范式
第一范式:字段不可分,强调的是列的原子性,即数据库表的每一列都是不可分割的原子数据项
第二范式:有主键,非主键字段依赖主键,要求实体的属性完全依赖于主关键字,所谓完全依赖是指不能存在仅依赖主关键字的一部分的属性
第三范式:非主键字段不能互相依赖,任何非主属性不能依赖于其他非主属性
DML,DDL,DCL
数据操作语言
数据定义语言
数据控制语言
数据结构与常见操作
varchar和char的区别
char是一种固定长度的类型,varchar则是一种可变长度的类型。比如char(128)和varchar(128),前者无论字符串长短,在磁盘上,都会占据固定的128字符大小,后者是可变长度,不过它最大也不能超过128
既然varchar是变长,那是不是设置varchar(1000)一定比varchar(100)好?
并非如此,虽然varchar是变长,在相同长度下,磁盘空间占用一样,将值设置更大一些,弹性空间也大,但也不是完全没有代价的,在内存加载的时候,每次都是按最大场景空间来分配的。显然在排序场景,或者一些临时表聚合场景,更大空间会产生明显的不利影响。
varchar中的长度不光影响磁盘空间,还会影响在使用时的内存空间
varchar是变长,char是定长,那能用varchar完全代替char么?
不能,varchar的优点是更灵活,但是char也不是一无是处。
首先,varchar会额外用一个字节存储长度信息,而char则节约了一个字节
其次,char的存储空间都是一次性分配的,存储是固定连续的,而varchar的存储的长度是可变的,当varchar更改前后数据长度不一致时,就不可避免的会出现碎片的问题。针对此,需要进行碎片消除作业,也是额外的成本
一般来说,长度固定的字段,还是使用char比较合适,比如hash,就很适合使用char
varchar(11)和int(11)中的50,有什么区别
varchar中代表能存11个字符,int中只是代表显示长度,对大多数应用没有意义,只是规定一些工具用来显示字符的个数,比如int(1)和int(20)存储和计算其实都是一样的
说说delete和truncate的区别
delete是删除行,truncate是整表删除。具体来说,有以下几点区别
1.truncate之后,会释放空间;delete之后,不会释放空间,因为delete只是在行上标记删除,后续可以复用
2.delete因为是DML,会产生redolog;truncate是DDL则不会
3.truncate效率更高
4.truncate之后,id从头开始;delete不会
MySQL特性考察
MySQL的存储引擎
1.首先有Innodb引擎,它提供了对数据库ACID事务的支持,并且还提供了行级锁和外键的约束,Innodb的设计目标就是处理大数据容量的数据库系统
2.还有MyIASM引擎,它是原本Mysql的默认引擎,不提供事务的支持,也不支持行级锁和外键
3.最后还有一个MEMORY引擎,它的所有数据都在内存中,数据的处理速度快,但是安全性不高,很少使用
ACID
原子性,一致性,隔离性,持久性
原子性:指的是一个事务只有执行成功和失败回滚两种状态,没有中间态
一致性:说的是数据状态一定是一致的
隔离性:说的是事务之间互不影响
持久性:事务执行完成后,对数据所做的操作持久的保存在数据库中
主键和外键
主键是表中的一个或多个字段,它的值用于唯一的标识表中的某一条记录
外键是说某张表b的主键,在另一张表a中被使用,那么a中该字段可以使用的范围,取决于b,外键约束主要用来维护两个表之间数据的一致性
一张表一定有主键吗?
是的,如果主动设置,则采用设置的,否则会自动生成一个默认的行
怎么查看有多少个sql语句在执行?
可以用show processlist,它是显示用户正在运行的线程的命令,需要注意的是,用户都只能看到自己正在运行的线程,除非是 root用户,或者专门进行了授权的用户
