关于数据库的面试问题(整理)

一、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,此时可以说是原子性的,但并不是一致性的(个人理解,有错望指出)。

五、索引

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

聚类索引:

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

非聚类索引:

索引的逻辑顺序与表中的物理顺序并没有关系,再拿查字典的例子说明,对于一个不认识的字,我们只能根据偏旁去搜索,具有相同偏旁的字在字典正文中并不是顺序放在一起。
索引是通过二叉树的结构来存储的,对于聚类索引,叶子结点即为数据结点,对于非聚类索引,叶子结点还是索引结点,作为指针指向对应的数据。

六、锁

多个事务并发操作数据库时,可能会破坏数据的一致性,所以要加锁(废话)。
锁可以分为行级锁和表级锁。
行级锁是一种排它锁,防止其他事务同时修改此行;
表级锁笼统的讲是将整个表锁定(共享锁),若本事务时读操作,那么其他事务只能读不能写,若本事务时写操作,那么其他事务连读都不行。

乐观锁和悲观锁

悲观锁:由名字可以知道它是“悲观”的,会认为它的任何操作都可能导致数据冲突,所以在数据操作过程中,都会处于锁定状态。利用数据库的锁机制,因为只有用了数据库层的锁机制,才能保证数据的排他性。加for update命令。
乐观锁:相对悲观锁而言,乐观锁比较宽松,它是通过在数据库中添加version字段来解决悲观锁在长事务情况下带来的问题。举例子说明吧:事务A获取数据D时,同时获取它的版本号为1,此时事务B也获取了数据D,同时获取它的版本号为1,当事务A操作完数据D后,同时将它的版本号加1变成2,更新数据库时,会去判断当前的版本号是否大于数据库中的版本号,如果大于,就能成功更新数据,否则会被认为是过期数据,更新失败。此时数据D的版本号大于数据库中的版本号,所以成功更新;当事务B操作完数据D后,也将版本号加1变为2,此时当要更新数据库时,发现当前版本号与数据库中的版本号相等,说明是过期数据,所以更新失败。

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


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: MySQL数据库有多种存储引擎可供选择。常用的存储引擎包括InnoDB引擎、MyISAM引擎和MEMORY引擎。InnoDB引擎提供了对数据库ACID事务的支持,并且还提供了行级锁和外键的约束。它的设计目标是处理大数据容量的数据库系统。MyISAM引擎不提供事务的支持,也不支持行级锁和外键。MEMORY引擎将所有的数据存储在内存中,因此数据的处理速度很快,但安全性较低。\[1\] MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,属于Oracle旗下产品。MySQL是最流行的关系型数据库管理系统之一,在WEB应用方面被广泛使用。它是开源免费的,并且方便扩展。\[2\] InnoDB是MySQL的默认存储引擎,而MyISAM在MySQL5.5.5之前是默认的存储引擎。\[3\] #### 引用[.reference_title] - *1* *2* [MySQL数据库面试题(2020最新版)](https://blog.csdn.net/ThinkWon/article/details/104778621)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [mysql数据库引擎常用面试总结](https://blog.csdn.net/sjyttkl/article/details/76176836)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值