- 数据库的三范式是什么?
- 第一范式:强调的是列的原子性,即数据库表的每一列都是不可分割的原子数据项;
- 第二范式:要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性。
- 第三范式:任何非主属性不依赖于其它非主属性。
- 一张自增表里面总共有7调数据,删除了最后2调数据,重启mysql数据库,又插入一条数据,此时id是几?
- 表类型如果是MyISAM,id是8;
- 表类型如果是InnoDB,id是6;
- InnoDB表只会把自增主键的最大id记录在内存中,所以重启之后会导致最大id丢失。
- select version() 获取当前mysql数据库版本。
- 说一下ACID?
- Atomicity(原子性):一个事务transaction中的所有操作,或者全部完成,或者全部不完成,不会结束在中间某个缓解,事务在执行过程中发生错误,会被恢复Rollback到事务开始前的状态,就像之歌事务从来没有执行过一样。
- Consistency(一致性):在事务开始之前和事务结束之后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设约束、触发器、级联回滚等。
- Isolation(隔离性):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时有与交叉执行而导致数据的不一致。事务隔离分为:读未提交Read uncommitted、读提交read committed、可重复读 repeatable read、串行化 Serializable。
- Durability(持久性):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
- char和varchar的区别是什么?
- char(n):固定长度类型,比如char(10),当你输入“abc"三个字符的时候,它们占用的空间还是10个字节,其他七个为空字节。
- char优点:效率高。缺点:占用空间。使用场景:存储密码的md5值,固定长度的,使用char
- varchar(n)可变长度,存储的值是每个值占用的字节再加上一个用来记录其长度的字节的长度。
- 从空间上考虑varchar比较合适,从效率上考虑char比较合适。
- float和double的却别是什么?
- float最多可以存储8位的十进制数,占4字节。
- double最多可以存储16为的十进制数,占8字节。
- mysql的左连接、内连接、有连接有什么区别?
- 内连接 inner join是吧匹配的关联数据显示出来;
- 左连接 left join是左边的表全部显示出来,右边的表显示出符合条件的数据;
- 右连接 right join 正好相反。
- 怎么验证mysql的索引是否满足需求?
- 使用explain查看SQL是如何执行查询语句的,从而分析你的索引值是否满足需求。
- explain select * from user where id = 1;
- 数据库的事务隔离如何实现?
- 在MySQL.ini配置文件里添加,在文件的最后添加
transaction-isolation = REPEATABLE-READ //默认 可重复读 会造成幻读
READ—UNCOMMITTED //未提交读 脏读幻读、不可重复读
READ-COMMITTED //提交读 幻读、不可重复读
SERIALIZABLE //序列化
- MySQL的常用引擎?
- InnoDB
mysql5.1后默认的数据库引擎,提供了对数据库acid事务的支持,并且还提供了行级锁和外键的约束,
它的设计的目标就是处理大数据容量的数据库系统。mysql运行的时候,InnoDB会在内存中建立缓冲池,
用户缓冲数据的索引。但是该引擎不支持全文搜索,同时启动也比较慢,它是不会保存表的行数,所以
当进行select count(*)from user 指令的时候,需要进行全表扫描。由于锁的力度小,写操作是不会
锁定全表的,所以在并发度较高的场景下使用会提升效率的。
- MyIASM
不提供事务的支持,也不支持行级锁和外键。因此当执行插入和更新语句时,即执行写操作的时候需要
锁定这个表,所以会导致效率会降低。不过和InnoDB不同的时,MyISAM引擎时保存了表的行数,于是当进行
select count(*) from user语句时,可以直接的读取已经保存的值儿不需要进行全表扫描,所以,如果表
的读操作远远多于写操作时,并且不需要事务的支持的,可以将MyISAM作为数据库的首选引擎。
- MYSQL的行锁和表锁?
- MyISAM只支持表锁,InnoDB支持表锁和行锁。
- 表级锁:开销小,加锁快。锁定粒度大,发生锁冲突的概率最高,并发量最低。
- 行级锁:开销大,加锁慢,会出现死锁。锁的粒度小,发生锁冲突的概率小,并发度最高。
- 乐观锁和悲观锁?
- 乐观锁:每次去拿数据的时候都会认为别人不会修改,所以不会上锁,但是在提交更新的时候会判断一下在此期间别人有没有去更新这个数据。
- 悲观锁:每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻止,直到这个锁被释放。
- 数据库的乐观锁需要自己实现,在表里面添加一个version字段,每次修改成功值加1,这样每次修改的时候先对比一下,自己拥有的version 和数据库现在的version是否一致,如果不一致就不修改,这样就实现了乐观锁。
- MySQL问题排查有哪些手段?
- 使用show processlist 命令查看当前所有连接信息
- 使用explain命令查询sql语句执行计划。
- 开启慢查询日志,查看慢查询sql
- 如何做Mysql性能优化?
- 为搜索字段创建索引
- 避免使用select * ,列出需要查询的字段
- 垂直分割分表
- 选择正确的存储引擎