面试——MySql


数据库三范式是什么?

  • 第一范式:强调列的原子性——数据库的每一列都是不可分割的原子数据项。
  • 第二范式:要求实体属性完全依赖于主关键字——指不能存在仅依赖主关键字一部分的属性。
  • 第三范式:任何非主属性不依赖于其它非主属性。

ACID是什么?

原子性、一致性、隔离性、持久性

Atomicity: 一个事务从开始到结束,要么全完成要么全失败。若在执行过程中发生错误,会被恢复(RollBack)到事务开始前的状态,之前就像没发生过。
Consistency: 在事务开始的前后,数据库的完整性没有被破坏。指写入的资料必须完全符合所有的预设约束、触发器、级联回滚等。
Isolation: 在多个并发事务同时对其数据进行读写和修改时,能防止多个事务并发执行时由于交叉执行而导致的数据不一致。隔离级别分为:读未提交、读提交、可重复读、序列化。
Durability: 事务处理结束后,对数据的修改是永久的,即使系统故障也不会丢失。


MySql的索引是怎么实现的?

索引是满足某种特定查找算法的数据结构,这些数据结构会以某种方式指向数据,以达到高效查找数据。
不同的数据引擎实现会有所不同,如今主流的数据库引擎的索引都是B+树实现的,其效率能达到二分法的性能,找到数据区域后就找到了完整的数据结构了。


描述下数据库的事务隔离

mysql的事务隔离是在MySQL.ini配置文件里的最后添加的:transcation-isolation=REPEATABLE-READ

可用配置值:(读未提交、读提交、可重复读、序列化)

  • READ-UNCOMMITTED:最低隔离级别,事务未提交前可被其它事务读取。(会出现幻读、脏读、不可重复读)
  • READ-COMMITTED:一个事务提交后才能被其它事务读取。(会出现幻读、不可重复读)
  • REPEATABLE-READ:默认,保证多次读取同一数据时,其值与事务开始时的内容是一致的,禁止读取到别的事物未提交的数据(会出现幻读)
  • SERIALIZABLE:代价最高最可靠隔离级别,能防止幻读、脏读、不可重复读。

幻读:在同一事物内多次查询返回的结果集不一样。其他原因也可出现:当另一事物新增、删除或修改了第一个事物结果集里的数据,同一记录里的数据内容被修改了,所有的数据行的记录就会变多或变少。
脏读:一个事物能读取另一事物中未提交的数据。
不可重复读:在同一事物内多次读取同一数据。


MySql有哪些常用引擎?

InnoDB: 它是MySQL5.1后默认的,它提供了对数据库ACID事物的支持,还提供了行级锁和外键约束,其设计目标就是处理大数据容量的数据库系统。在运行时,InnoDB会在内存中建立缓冲池,用于缓冲数据和索引。但该引擎不支持全文检索,且启动时也较慢,还不会保存表的行数,因此在select count(*) from table时得要进行扫描全表。由于锁的粒度较小,写操作是不会锁定全表的,所以在并发度较高的场景下使用能提升效率。

MyIASM: 它不提供事物的支持和行级锁以及外键约束。因此当执行插入和更新语句时(执行写操作)需要锁定这个表,这就导致效率会降低。但它能保存表的行数的,因此在select count(*) from table时无需扫描全表,就能直接读取已经保存的值。所以若是表的读操作远多于写操作时,且无需事物支持的,应将此引擎作为首选。


简述下MySql的行锁和表锁

InnDB支持表锁和行锁,默认行锁;MyIASM只支持表锁。

  • 表级锁:开销小,加锁快,不会出现死锁。锁粒度大,发生锁冲突的概率最高,并发量最低。
  • 行级锁:开销大,加锁慢,会出现死锁。锁粒度小,发生锁冲突的概率最低,并发量最高。

你是如何理解乐观锁和悲观锁的?

乐观锁: 每次去拿数据时认为别人不会修改,便不上锁,但在提交更新时会去判断在这期间里别人是否更新过此数据。
悲观锁: 每次去拿数据时认为别人会修改,便上锁,直到锁被释放后别人才能拿到此数据。

乐观锁是需要手动实现的,在表里添加一个version字段,每次修改成功便+1,如此每次修改是先进行对比手上的version和数据库里的version是否一致,不一致就不修改。


排查问题时MySql有哪些方案?

  • 使用show processlist命令查看当前所有连接信息。
  • 使用explain命令查询SQL语句执行计划。
  • 开启慢查询日志,查询慢查询的SQL。

MySql性能优化有哪些方案?

  • 避免使用**select * **,应列出需要查询的字段。
  • 选择正确的存储引擎。
  • 位搜索字段创建索引。
  • 垂直分割分表。

内连接、左连接、右连接的区别?

内连接:inner join —— 将匹配的关联数据显示出来。
左连接:left join —— 左边的表全显示,右边的表只显示符合条件的数据。
右连接:right join —— 和左连接相反。


char和varchar的区别?

char:固定长度类型
varchar:可变长度类型
从空间出发varchar合适,从效率出发char合适。


float和double的区别?

float:可存储8位的十进制数,内存中占4字节。
double:可存储16位的十进制数,内存中占8字节。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值