开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第28天,点击查看活动详情
InnoDB和MyISAM区别
- MyISAM: 只支持表级锁,用户在操作myisam表时,select,update,delete,insert语句都会给表自动加锁,如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据.
- InnoDB: 支持事务和行级锁,是innodb的最大特色.行锁大幅度提高了多用户并发操作的新能.但是InnoDB的行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的
- InnoDB引擎DELETE 表时,是一行一行的删除,MyISAM引擎则是先drop表,然后重建表
- MyISAM相对简单所以在效率上要优于InnoDB
- 读多写少用MyISAM,读少写多高并发用InnoDB
char和varchar区别
- char是一种固定长度的类型
- varchar则是一种可变长度的类型
FLOAT DOUBLE DECIMAL区别
- DECIMAL使用的时候要指定精度,否则按照默认值decimal(10,0) 来操作
- 在长度一定的情况下,浮点数能够表示更大的数据范围,但是缺点是会引起精度问题
- 一般货币、科学数据使用DECIMAL
MySQL的复制原理以及流程
- 主: binlog线程——记录下所有改变了数据库数据的语句,放进master上的binlog中;
- 从: io线程——在使用start slave 之后,负责从master上拉取 binlog 内容,放进 自己的relay log中;
- 从: sql执行线程——执行relay log中的语句;
innodb引擎的4大特性
- 插入缓冲(insert buffer)
- 二次写(double write)
- 自适应哈希索引(ahi)
- 预读(read ahead)
varchar(50)中50的涵义
- 最多存放50个字符
int(20)中20的涵义
- 指显示字符的长度
MySQL日志类型
- 错误日志: 记录出错信息,也记录一些警告信息或者正确的信息.
- 查询日志: 记录所有对数据库请求的信息,不论这些请求是否得到了正确的执行.
- 慢查询日志: 设置一个阈值,将运行时间超过该值的所有SQL语句都记录到慢查询的日志文件中.
- 二进制日志: 记录对数据库执行更改的所有操作.
- 中继日志:
- 事务日志:
drop,delete与truncate的区别
- drop直接删掉表
- truncate删除表中数据,再插入时自增长id又从1开始
- delete删除表中数据,可以加where字句.
什么情况下设置了索引但无法使用
- 以“%”开头的LIKE语句,模糊匹配
- OR语句前后没有同时使用索引
- 数据类型出现隐式转化(如varchar不加单引号的话可能会自动转换为int型)
如何通俗地理解三个范式
- 第一范式: 1NF是对属性的原子性约束,要求属性具有原子性,不可再分解;
- 第二范式: 2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性;
- 第三范式: 3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余
主键、外键和索引的区别
- 主键
- 唯一标识一条记录,不能有重复的,不允许为空
- 用来保证数据完整性
- 主键只能有一个
- 外键
- 表的外键是另一表的主键, 外键可以有重复的, 可以是空值
- 用来和其他表建立联系用的
- 一个表可以有多个外键
- 索引
- 该字段没有重复值,但可以有一个空值
- 是提高查询排序的速度
- 一个表可以有多个唯一索引
数据库的优化
- 从结构层
- web服务器采用负载均衡服务器,mysql服务器采用主从复制,读写分离
- 从储存层
- 采用合适的存储引擎,采用三范式
- 从设计层
- 采用分区分表,索引,表的字段采用合适的字段属性,适当的采用逆范式,开启mysql缓存
- sql语句层
- 结果一样的情况下,采用效率高,速度快节省资源的sql语句执行
SQL语言包括哪几部分
- 数据定义(DDL)
- create table, alter table, drop table, craete/drop index等
- 数据操纵(DML)
- select ,insert,update,delete,
- 数据控制(DCL)
- grant,revoke
- 数据查询(DQL)
- select
事务定义及其特性
- 是一系列的数据库操作
- 如果组中的所有操作都成功,则认为事务成功,即使只有一个操作失败,事务也不成功.如果所有操作 完成,事务则提交,其修改将作用于所有其他数据库进程.如果一个操作失败,则事务将回滚,该事务所有操作的影响都将取消.
- 原子性 一致性 隔离性 持久性
MySQL四种隔离级别
- Serializable (串行化): 可避免脏读、不可重复读、幻读的发生.(锁表)
- Repeatable read (可重复读): 可避免脏读、不可重复读的发生.
- Read committed (读已提交): 可避免脏读的发生.(一个事务只能看见已经提交事务所做的改变)
- Read uncommitted (读未提交): 最低级别,任何情况都无法保证.(脏读)