164、数据库的三范式是什么?
第一范式: 强调的是列的原子性,即数据库表的每一列都是不可分割的原子数据项。
第二范式:要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分属性。
第三范式: 任何非主属性不依赖于其它非主属性。
165、一张自增表里面有17条数据,删除了最后两条数据,重启MySql数据库,又插入了一条数据,此时Id是几?
表类型如果是MyISAM,那id就是18.
表类型如果是InnoDB,那id就是16
因为InnoDB表只会把自增的最大Id记录在内存中,所有重启后导致最大Id丢失。
166、如何获取当前数据库的版本
使用select version()获取当前MySql数据库版本
167、说一下ACID是什么?
Actomicity原子性
Consistency 一致性
Isolation 隔离性
Durability 持久性
168、char和varchar的区别是什么?
char(n): 固定长度类型,比如char(10),当你输入“abc”三个字符的时候,它们占用的空间是10个字符,其它7个是空字符。
char的优点: 效率高; 缺点:占用空间; 适用场景: 存储密码的md5值,固定长度的,适用char非常合适。
varchar(2):可变长度,存储的值是每个值占用的字节再加上一个用来记录其长度的字节的长度。
所以,从空间上考虑varchar比较合适,从效率上考虑char比较合适,二者使用需要权衡。
169、float和double的区别是什么?
float最多可以存储8位的十进制,并在内存中占4个字节
double最多可以存储16位十进制,并在内存中占8个字节。
170、MySql的内连接、左 连接、右连接有什么区别?
内连接关键字: inner join, 左连接: left join, 右连接: right join
内连接时把匹配的关联数据显示处理;
左连接是左边的表全部显示出来。
右连接与左连接正好相反。
171. MySQL索引的实现?
索引是满足某种特定查找算法的数据结构,而这些数据结构以某种方式指向数据,从而实现高效查找数据。
具体来说MySQL中的索引,不同的数据引擎实现有所不同,但是目前主流的数据库引擎的索引都是B+树实现的,B+树的搜索效率,可以达到二分法的性能,找到数据区域之后就能找到了完整的数据结构,索引索引的性能也更好。
172、怎么验证MySql的索引是满足需求的?
使用explain查看SQL是如何执行查询语句的,从而分析你的索引是否满足需求
explain语法:explain select * from table where type = 1
173、说一下数据库的事务隔离?
MySQL的事务隔离是在MySQL.ini配置文件里添加的,在文件的最后添加
transaction-isolation=REPEATABLE-READ
可用的配置有READ-UNCOMMITED,READ-COMMITED,REPEATABLE-READ,SERIALIZABLE
READ-UNCOMMITED: 未提交读,最低隔离级别、事务未提交前,就可被其它事务读取。(会出现幻读,脏读,不可重复读)
READ-COMMITED: 提交读,一个事务提交后才能被其它事务读取到(会造成幻读和不可重复读?)
REPEATABLE-READ: 可重复读,默认级别,保证多次读取同一个数据时,其值都和事务开始的内容一致,禁止读取到被的事务未提交的数据。(会造成幻读?)
SERIALIZABLE: 序列化,代价最高最可靠的隔离级别,该隔离级别能防止脏读,不可重复读,幻读。
脏读:表示一个事务能读取另一个事务中未提交的数据。比如某个事务尝试插入记录A,此时事务还未提交,然后另一个事务尝试读取到了记录A。
不可重复读:是指在一个事务内,多次读同一数据。
幻读:指同一个事务内多次查询返回的结果集不一样。比如同一个事务A第一次查询时候有n条记录,但是第二次同等条件下查询到有n+1条记录,这就好像产生了幻觉。发生幻读的原因也是另外一个事务新增或删除或者修改了第一个事务结果集里面的数据,同一个记录的数据内容被修改了,所有数据行的记录就变多了或者变少了。
174、说一下MySQL常用的引擎?
InnoDB引擎:InnoDB引擎提供了对数据库的acid事务支持,并且还提供了行级锁和外键的约束,它的数据的目标就是处理大数据容量的数据库系统。MySQL运行的时候,InnoDB会在内存中建立缓冲池,用于缓冲数据和索引。但是该引擎是不会支持全文搜索的,同时启动也比较慢,它是不会保存表的行数的,所以当进行select cout(*) from table指令的时候,需要进行全表扫描。由于锁的粒度小,写操作不会锁定全表的,索引在并发度高的场景下使用会提升效率。
MyIASM引擎:MySql的默认引擎,单不提供事务的支持,也不支持行级锁和外键。因此当执行插入或更新操作时,即执行写操作需要锁定这个表,所以会导致效率降低。不过和InnoDB不同的是,MyIASM引擎保存了表的行数,于是当进行elect cout(*) from table指令的时候,可以直接的读取已经保存的值而不需要进行全表扫描。所以,如果表的读操作远远低于写操作,并且不需要事务的支持的,可以将MyIASM作为数据库引擎的首选。
175、说一下MySQL的行锁和表锁?
MyISAM只支持表锁,InnoDB支持表锁和行锁,默认为行锁。
表级锁:开销小,加锁快,不会出现死锁。锁粒度大,发生锁冲突的概率高,并发量最低
行级锁: 开销大,加锁慢,会出现死锁。锁粒度小,发生锁冲突的概率小,并发度最高。
176、说一下乐观锁和悲观锁?
乐观锁: 每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在提交更新的时候会判断一下在此期间别人有没有去更新这个数据。
悲观锁: 每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人都想拿这个数据就会阻止,直到这个锁被释放。
数据库的乐观锁需要自己实现,在表里添加一个version字段,每次修改成功值会加1,这样每次修改的时候先对比一下,自己拥有的version和数据库现在的version是否一致,如果不一致就不修改,这样就实现了乐观锁。
177、MySQL问题排查有哪些手段?
使用show processlist命令查看当前所有连接信息
使用explain命令查询SQL语句执行计划
开启慢查询日志,查看慢查询的SQL
178、如何做MySQL的性能优化
为搜索字段创建索引
避免使用select *, 列出需要查询的字段
垂直分割分表
选择正确的存储引擎。