数据库相关面试
-
MySQL
-
char和varchar的区别
- char是一种固定长度的类型,例如当设置为char(20)的时候,固定长度为20,存储时长度不够20的,也按照20的长度。varchar是一种可变长度的类型,例如设置为varchar(20)的时候,存储的长度是5,那么长度就为5。
-
存储引擎InnoDB和MyISAM的区别
- InnoDB支持事务,MyISAM不支持。
- InnoDB支持外键,MyISAM不支持。
- MyISAM支持全文类型索引,而InnoDB不支持全文索引(5.7以后支持)。
- InnoDB中不保存表的总行数,select count(*) from table时,InnoDB需要扫描整个表计算有多少行,但MyISAM只需简单读出保存好的总行数即可。注:当count(*)语句包含where条件时MyISAM也需扫描整个表。
- InnoDB支持表、行(默认)级锁,而MyISAM支持表级锁
-
索引
- 索引类型:
- 普通索引(index):数据可以重复,没有任何限制。
- 唯一索引(unique):要求索引列的值必须唯一,但允许有空值;如果是组合索引,那么列值的组合必须唯一。
- 主键索引(primary key):是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值,一般是在创建表的同时创建主键索引。
- 复合索引:将多个列组合在一起创建索引,可以覆盖多个列。
- 索引类型:
-
MySQL的事务特性和隔离级别
- 事务的特性(ACID):
- 原子性(Atomicity):在同一事务中,所有的操作,要么都成功,要么都失败。
- 一致性(Consistency):事务的前后,数据的状态是一致的,不会发生改变。例如张三转给李四100元,张三账户扣了100元,那么李四的账户就会收到100元。这个数据的前后状态没有改变。
- 隔离性(Isolation):事务和事务之间是相互隔离,互不干扰的。
- 持久性(Durability):指一个事务一旦被提交,它对数据库中数据的改变就是永久性的。
- 数据的隔离级别:
- Read uncommitted:读未提交,能够读取到没有被提交的数据,所以这个级别的隔离机制无法解决脏读、不可重复读、幻读中的任何一种。
- Read committed:读已提交,能够读到那些已经提交的数据,所以能够防止脏读,但是无法限制不可重复读和幻读
- Repeatable read:重复读,通过加锁机制,禁止修改,所以能够防止不可重复读,但无法限制幻读。
- Serializable(可串行化):强制事务串行执行。
- mysql默认事务级别为:Repeatable read
- 事务的隔离级别:
- 脏读:即一个事务读到了另一个事务还未提交的数据。
- 不可重复读:在同一个事务中,读取两次数据,读出来的数据不一样。例如:一个事务读取同一个数据,同时另一个事务在对这个数据进行更新并提交,导致第一个事务读取同一个数据,出现了不同的结果。不可重复读主要针对的是更新操作。
- 幻读:当一个事务读取数据的时候发现不存在,同时另一个事务对这个数据进行了插入,当第一个事务进行数据插入的时候,发现记录已经存在,无法存入。这个就是幻读。幻读主要针对的是插入操作。
-
事务隔离级别 脏读 不可重复读 幻读 读未提交(Read uncommitted) 是 是 是 读已提交(Read committed) 否 是 是 可重复读(Repeatable read) 否 否 是 串行化(Serializable) 否 否 否
- 事务的特性(ACID):
-
MySQL锁机制
- 悲观锁:总是持着悲观的态度,每次读取数据的时候都默认其他线程会更改数据,因此需要进行加锁操作,当其他线程想要访问数据时,都需要阻塞挂起。悲观锁分为:共享锁和排它锁。悲观锁通常方式为:select * from table for update
- 共享锁(S):共享锁也称为读锁,读锁允许多个连接可以同一时刻并发的读取同一资源,互不干扰;
- 排它锁(X):排他锁也称为写锁,一个写锁会阻塞其他的写锁或读锁,保证同一时刻只允许一个用户进行写入,防止其他用户对这个数据的读写。
- 乐观锁:修改数据时默认其他线程不会更改数据,当修改完成后提交的时候带上版本号进行比对,如果一致就提交成功,并且版本号加一。如果不一致则提交失败。
- 悲观锁:总是持着悲观的态度,每次读取数据的时候都默认其他线程会更改数据,因此需要进行加锁操作,当其他线程想要访问数据时,都需要阻塞挂起。悲观锁分为:共享锁和排它锁。悲观锁通常方式为:select * from table for update
-
-
Oracle
-
oracle如何进行分页的
- 使用rownum进行分页的。如:select * from tb_user where rownum >=1 and rownum <=10
-
truncate和delete区别
-
Truncate和delete都可以将数据实体删掉,truncate操作不记录到rollback日志,同时数据不能恢复。
- Truncate是数据定义语言(DDL),delete是数据操作语言(DML)。
- Truncate不能对视图进行操作,delete操作不会腾出表空间的内存。
-
-