数据库的三范式
第一范式:要求任何一张表都必须有主键,每一个字段原子性不可再分。
第二范式:建立在第一范式的基础上,要求所有非主键字段完全依赖主键,不产生部分依赖。
第三范式:建立在第二范式的基础上,要求所有非主键字段直接依赖主键,不产生间接依赖。
char(n)和varchar(n)的区别
在5.0.3版本之后,n表示字符数,而非字节数。
char是定长类型,输入长度小于声明时的长度,会在末尾自动补空格,输入长度超过则会截断。char(n) n取值范围0~255,输出时会自动截断末尾添加的空格串,实际所占字符数为声明时的n。
varchar是不定长类型 varchar(n),n范围0~65535,指其能保存数据的最大字符数,varchar类型实际使用字节数为数据所占字节数+长度所占字节数。
MySQL索引的优缺点
优点:
1.提高数据检索的效率,降低数据库的IO成本。
2.通过索引对数据进行排序,降低数据排序的成本,降低CPU的消耗
缺点:
1.虽然索引大大提高了检索的效率,但是却会降低更新表的效率。每一次增删改时,MySQL不仅要保存数据,还要更新调整索引。
2.本质上索引也是数据,需要占用一定空间。
索引失效的情况
1.要遵循最左前缀法则,具体就是查询从索引的最左前列开始并且不跳过索引中的列,查询字段与索引字段顺序要相同,不相同会导致索引部分失效,甚至完全失效。
2.在查询的索引列上进行操作,如运算、函数和转换等。
3.范围查询之后的索引会失效。
4.使用!=时也导致索引失效,变为全表扫描。
5.使用is not null时。
6.用like进行模糊匹配时,如果%用在前缀上。
7.使用or时,尽量使用union来替代。
redo log与binlog的区别
1.redo log 是 InnoDB 引擎特有的;binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使用。
2.redo log 是物理日志,记录的是在某个数据页上做了什么修改;binlog 是逻辑日志,记录的是这个语句的原始逻辑。
3.redo log 是循环写的,空间固定会用完;binlog 是可以追加写入的。追加写是指 binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。
数据库主键自增和UUID
自增的优点:1.数据存储空间小;2.性能好;3.容易记忆。
自增的缺点:1.安全性差;2.较难处理分布式表。
UUID的优点:1.独一无二;2.适用于高并发和分布式;3.安全性较高。
UUID的缺点:1.数据存储空间大;2.会降低性能;3.很难记忆
总结:自增适用于数据量大,对效率要求高的场景;UUID适用于数据量小,对安全要求高的场景。
MVCC解决的问题
MVCC是一种用来解决读写冲突的无锁并发控制
MVCC能够解决:
1.在并发读写数据库时,做到在读操作时不用阻塞写操作,写操作时也不用阻塞读操作,提高了数据库并发读写的性能。
2.解决脏读、幻读、不可重复度等事务隔离问题,但是不能解决更新丢失问题。