Mysql
1、Mysql有哪些存储引擎:
InnoDB、MyISAM、Memory、NDB。InnoDB 现在是 MySQL 默认的存储引擎,⽀持事务、⾏级锁定和外键
2、InnoDB 和MyISAM 的区别
InnoDB ⽀持事务,MyISAM 不⽀持事务。这是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之⼀; 2.InnoDB ⽀持外键,⽽ MyISAM 不⽀持。对⼀个包含外键的 InnoDB 表转为 MYISAM 会失败
3、mysql索引类型:
1.普通索引:最基本的索引,它没有任何限制,值可以为空;仅加速查询
2.唯一索引:唯一索引与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。简单来说:唯一索引是加速查询 + 列值唯一(可以有null)
3.主键索引:主键索引是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。简单来说:主键索引是加速查询 + 列值唯一(不可以有null)+ 表中只有一个。
4.组合索引:组合索引指在多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用组合索引时遵循最左前缀集合。
5.全文索引:全文索引主要用来查找文本中的关键字,而不是直接与索引中的值相比较。fulltext索引跟其它索引大不相同,它更像是一个搜索引擎,而不是简单的where语句的参数匹配。fulltext索引配合match against操作使用,而不是一般的where语句加like。它可以在create table,alter table ,create index使用,不过目前只有char、varchar,text 列上可以创建全文索引。值得一提的是,在数据量较大时候,现将数据放入一个没有全局索引的表中,然后再用CREATE index创建fulltext索引,要比先为一张表建立fulltext然后再将数据写入的速度快很多。
4、数据库隔离机制有哪些?默认是什么?
1、READ-UNCOMMITTED(读未提交):最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读
2、READ-COMMITTED(读已提交):允许读取并发事务已经提交的数据,可以阻⽌脏读,但是幻读或不可重复读仍有可能发⽣
3、REPEATABLE-READ(可重复读):对同⼀字段的多次读取结果都是⼀致的,除⾮数据是被本身事务⾃⼰所修改,可以阻⽌脏读和不可重复读,但幻读仍有可能发⽣
4、SERIALIZABLE(可串⾏化):最⾼的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执⾏,这样事务之间就完全不可能产⽣⼲扰,也就是说,该级别可以防⽌脏读,不可重复读以及幻读
Mysql默认的隔离级别就是可重复读
5、ACID — 事务基本要素
原子性/一致性/隔离性/持久性
6、什么是幻读,脏读,不可重复读呢?
脏读(Dirty Reads):事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
不可重复读(Non-Repeatable Reads):事务 A 多次读取同⼀数据,事务B在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同 ⼀数据时,结果不⼀致。
幻读(Phantom Reads):幻读与不可重复读类似。它发⽣在⼀个事务A读取了⼏⾏数据,接着另⼀个并发事务B插⼊了⼀些数据时。在随后的查询中,事 务A就会发现多了⼀些原本不存在的记录,就好像发生了幻觉一样
幻读和不可重复读的区别: 不可重复读的重点是修改:在同⼀事务中,同样的条件,第⼀次读的数据和第⼆次读的数据不⼀样。(因为中间有其他事务 提交了修改)
幻读的重点在于新增或者删除:在同⼀事务中,同样的条件,,第⼀次和第⼆次读出来的记录数不⼀样。(因为中间有其他事务提交了插⼊/删除)
7、谈谈你对锁的了解,都了解哪些锁
数据库锁定机制简单来说,就是数据库为 了保证数据的⼀致性,⽽使各种共享资源在被并发访问变得有序所设计的⼀种规则。
表级锁:开销⼩,加锁快;不会出现死锁;锁定粒度⼤,发⽣锁冲突的概率最⾼,并发度最低(MyISAM 和 MEMORY 存储引擎采⽤的是表级锁)
⾏级锁:开销⼤,加锁慢;会出现死锁;锁定粒度最⼩,发⽣锁冲突的概率最低,并发度也最⾼(InnoDB 存储引擎既⽀持⾏级锁也⽀持表级锁,但默认情况下是采⽤⾏级 锁
页⾯锁:开销和加锁时间界于表锁和⾏锁之间;会出现死锁;锁定粒度界于表锁和⾏锁之间,并发度⼀般。
死锁的产生:死锁是指两个或多个事务在同⼀资源上相互占⽤,并请求锁定对⽅占⽤的资源,从⽽导致恶性循环
检测死锁:数据库系统实现了各种死锁检测和死锁超时的机制。InnoDB存储引擎能检测到死锁的循环依赖并⽴即返回⼀个错误。
死锁恢复:死锁发⽣以后,只有部分或完全回滚其中⼀个事务,才能打破死锁,InnoDB⽬前处理死锁的⽅法是,将持有最少⾏级排他锁的事务进⾏回滚。所以事务型应⽤程序在设计时必须考虑如何处理死锁,多数情况下只需要重新执⾏因死锁回滚的事务即可。