数据库面试相关

文章目录

MyISAM与INNODB的区别

MyISAM强调效率,执行速度比InnoDB快,但是不支持事务,不能在表损坏后修复数据。

InnoDB不保存行号,就是在执行count操作时,需要扫描整个表,而MyISAM只要直接读出行号就行。注意:如果count与where组合使用两种引擎都是需要扫描整个表。

MyISAM用的是表锁,InnoDB用的是行锁,其实并不一定,因为当不确定扫描对象时,还是会锁住整张表

MyISAM适用:

1. count操作多

2. 插入少,查询多

3. 不需要事务

InnoDB适用:

1. 可靠性高,或者需要支持事务

2. 插入和查询都比较多

触发器

所谓触发器就是通过实践来触发操作的,作用是可以强化约束,保证数据的完整性和一致性,也可以跟踪数据库的操作从而不允许未经许可的更新和变化。比如一张数据表的更新会触发另一张表数据的更新等等。

存储过程

所谓存储过程就是预编译的SQL语句,支持模块化设计,说白了就是创建一次,在程序中可以被多次调用。例如某次操作需要执行多次SQL,就可以把这个SQL做一个存储过程。存储过程比单纯的SQL语句执行要快,因为它是预编译的。

事务

所谓事务就是绑定在一起的一个逻辑工作单元的SQL语句分组(通俗理解为绑定在一起的一堆SQL语句),如果某个SQL语句操作失败,那么所有的操作都将失败,将状态回滚到操作前的状态,即要么全部执行,要么全部不执行。它有四个特性:原子性、一致性、隔离性、持久性。

注意:原子性的不一定是一致性的,举个例子:转账,A转100给B,A的账户减少100,B的账户增加50,此时可以说是原子性的,但并不是一致性的(个人理解,有错望指出)。

索引

索引的优点当然是快速搜索,但是也不能滥用索引,因为创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加;索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大;当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

索引又分为聚类索引和非聚类索引。先简单讲讲个人的理解:

大专栏  数据库面试相关itle="聚类索引:">聚类索引:

聚类索引是索引的逻辑顺序决定表的物理顺序,可以拿查字典的例子说明,所有“z”开头的字都是放在字典的最后几页,“z”这个字母在字母表中顺序即为字典在正文中的顺序。

非聚类索引:

索引的逻辑顺序与表中的物理顺序并没有关系,再拿查字典的例子说明,对于一个不认识的字,我们只能根据偏旁去搜索,具有相同偏旁的字在字典正文中并不是顺序放在一起。

索引是通过二叉树的结构来存储的,对于聚类索引,叶子结点即为数据结点,对于非聚类索引,叶子结点还是索引结点,作为指针指向对应的数据。

具体描述,可参看http://www.cnblogs.com/aspnethot/articles/1504082.html

多个事务并发操作数据库时,可能会破坏数据的一致性,所以要加锁(废话)。

锁可以分为行级锁和表级锁。

行级锁是一种排它锁,防止其他事务同时修改此行;

表级锁笼统的讲是将整个表锁定(共享锁),若本事务时读操作,那么其他事务只能读不能写,若本事务时写操作,那么其他事务连读都不行。

乐观锁和悲观锁

悲观锁:由名字可以知道它是“悲观”的,会认为它的任何操作都可能导致数据冲突,所以在数据操作过程中,都会处于锁定状态。利用数据库的锁机制,因为只有用了数据库层的锁机制,才能保证数据的排他性。加for update命令。

乐观锁:相对悲观锁而言,乐观锁比较宽松,它是通过在数据库中添加version字段来解决悲观锁在长事务情况下带来的问题。举例子说明吧:事务A获取数据D时,同时获取它的版本号为1,此时事务B也获取了数据D,同时获取它的版本号为1,当事务A操作完数据D后,同时将它的版本号加1变成2,更新数据库时,会去判断当前的版本号是否大于数据库中的版本号,如果大于,就能成功更新数据,否则会被认为是过期数据,更新失败。此时数据D的版本号大于数据库中的版本号,所以成功更新;当事务B操作完数据D后,也将版本号加1变为2,此时当要更新数据库时,发现当前版本号与数据库中的版本号相等,说明是过期数据,所以更新失败。

悲观锁虽然能有效地控制数据的一致性,但是对于长事务而言,比较消耗数据库性能,此时就需要用乐观锁。hibernate在数据访问引擎中内置了乐观锁实现。

猜你喜欢

转载自www.cnblogs.com/dajunjun/p/11694112.html