真实面试经历(5)

问题1:MySql存储引擎

程序开发流程:了解需求,选择存储引擎,设计数据库.

MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。

例如,如果你在研究大量的临时数据,你也许需要使用内存存储引擎。内存存储引擎能够在内存中存储所有的表格数据。又或者,你也许需要一个支持事务处理的数据库(以确保事务处理不成功时数据的回退能力)。

这些不同的技术以及配套的相关功能在MySQL中被称作存储引擎(也称作表类型)。MySQL默认配置了许多不同的存储引擎,可以预先设置或者在MySQL服务器中启用。你可以选择适用于服务器、数据库和表格的存储引擎,以便在选择如何存储你的信息、如何检索这些信息以及你需要你的数据结合什么性能和功能的时候为你提供最大的灵活性。

选择如何存储和检索你的数据的这种灵活性是MySQL为什么如此受欢迎的主要原因。

分类:

MyISAM: 拥有较高的插入,查询速度,但不支持事务

InnoDB :5.5版本后Mysql的默认数据库,事务型数据库的首选引擎,支持ACID事务,支持行级锁定

BDB: 源自Berkeley DB,事务型数据库的另一种选择,支持COMMIT和ROLLBACK等其他事务特性

Memory :所有数据置于内存的存储引擎,拥有极高的插入,更新和查询效率。但是会占用和数据量成正比的内存空间。并且其内容会在Mysql重新启动时丢失

Merge :将一定数量的MyISAM表联合而成一个整体,在超大规模数据存储时很有用

Archive :非常适合存储大量的独立的,作为历史记录的数据。因为它们不经常被读取。Archive拥有高效的插入速度,但其对查询的支持相对较差

Federated: 将不同的Mysql服务器联合起来,逻辑上组成一个完整的数据库。非常适合分布式应用

扫描二维码关注公众号,回复: 3529572 查看本文章

Cluster/NDB :高冗余的存储引擎,用多台数据机器联合提供服务以提高整体性能和安全性。适合数据量大,安全和性能要求高的应用

CSV: 逻辑上由逗号分割数据的存储引擎。它会在数据库子目录里为每个数据表创建一个.CSV文件。这是一种普通文本文件,每个数据行占用一个文本行。CSV存储引擎不支持索引。

BlackHole :黑洞引擎,写入的任何数据都会消失,一般用于记录binlog做复制的中继

另外,Mysql的存储引擎接口定义良好。有兴趣的开发者通过阅读文档编写自己的存储引擎。

问题2:从一亿条数据中查询一条数据(效率)

方式1:建立适当的索引(建立索引要消耗时间)

方式2:多个线程同时查询

如果是Oracle也可以进行分表、分区、分库等操作

问题3:线程之间的通信

为什么要线程通信?

1. 多个线程并发执行时, 在默认情况下CPU是随机切换线程的,当我们需要多个线程来共同完成一件任务,
并且我们希望他们有规律的执行, 那么多线程之间需要一些协调通信,以此来帮我们达到多线程共同操作一份数据。
2.当然如果我们没有使用线程通信来使用多线程共同操作同一份数据的话,虽然可以实现,
但是在很大程度会造成多线程之间对同一共享变量的争夺,那样的话势必为造成很多错误和损失!
3.所以,我们才引出了线程之间的通信,多线程之间的通信能够避免对同一共享变量的争夺。

消息通信的方式:

1、使用等待唤醒机制:(wait()、notify()或notifyAll)

2、消息队列,是最常用的一种,也是最灵活的一种,通过自定义数据结构,可以传输复杂和简单的数据结构

windows下的PostMessage,Linux下的msgsend

3、利用系统的提供的事件、信号等通知机制、使用同步锁和自定义数据结构等来实现

4、通过管道实现,管道也可以实现线程之间的通迅,管道不但可以用于线程通迅也可以用于进程间的通迅,使用起来也很简单

5、利用套接字的方式来实现,也就是常用的tcp和udp这些套接字,这种一般正规的服务器通迅才用,线程通迅用这个就有点复杂了

最方便常用的是使用系统的消息队列来实现,但是对平台依赖太强,不适合跨平台项目的开发,现在也有好多标准可用的库可以使用,可以满足基本需要了,常用标准库有boost,优点是提供了常用的功能,缺点是太过于庞大笨重了,不适合一些小项目或者都嵌入式这类项目

问题4:应用程序消耗资源特别高,怎么判断是哪的问题

可以将程序放在linux上运行,将进程分解为多个线程,观察进程,再使用工具由进程定位到具体代码.

问题5:mybatis和hibernate对比

相同点:

(1)Hibernate与MyBatis都是通过SessionFactoryBuider由XML配置文件生成SessionFactory,由SessionFactory 生成Session,由Session来开启执行事务和SQL(Structured Query Language,结构化查询语言)语句。

(2)Hibernate和MyBatis都支持JDBC(Java DataBase Connectivity,java数据库连接)和JTA(Java Transaction API,Java事务API(Application Programming Interface,应用程序编程接口))事务处理。

注:jdbc和jta的主要作用是增强数据访问能力。

(3)基于ORM(Object Relational Mapping, 对象关系映射)思想解决了entity和数据库的映射问题

不同点:

(1)sql方面:mybaits通过mapper.xml维护映射结果,程序员手动编写sql相比hibernate自动生成hql(hibernate sql)更加灵活,sql调优更加容易(hibernate因为更好的封装性,开发效率提高的同时,sql语句调优要更费力,当然可以手动修改sql来优化,但是同时也会影响开发效率);hibernate的hql数据库移植性更好,体现在强壮性。hibernate在级联删除的时候效率低;数据量大, 表多的时候,基于关系操作会变得复杂。

(2)缓存方面:mybatis和hibernate都可以使用第三方缓存,而hibernate相比maybatis有更好的二级缓存机制。

详情链接:深入浅析Mybatis与Hibernate的区别与用途

猜你喜欢

转载自blog.csdn.net/zaimeiyeshicengjing/article/details/81638401