我最近参加了一次采访,有人问我一个问题
我们有一个表employee(id, name)
。在我们的Java代码中,我们正在编写一种逻辑来从该表中获取数据并将其显示在UI中。查询是
Select id,name from employee
查询是在调试过程中,我们发现此jdbc调用触发了查询并获得了20秒的输出,我们希望将其减少为5秒或最佳时间。您如何才能做到这一点,或者我将如何解决这个问题?
由于查询中没有where clause
,因此我不建议对该列建立索引。
由于此逻辑每次要花费20秒,因此,其他一些锁定该表的代码也毫无疑问。
我建议限制从表中获取的记录数量应该会有所帮助,但是面试官看起来并不确信
作为开发人员,我们还有其他事情可以优化电话吗?我猜DBA可能会调整数据库设置以提高此查询的性能,但是还有其他方法吗
答案 0 :(得分:3)
好的,所以这是一个面试问题,因此问题和解决方案都是假设的。面试官正在寻求可能的优化和/或方法。以下是最有可能帮助您的一些信息:
将查询修改为 page 数据,而不是提取全部数据。这看起来适用于示例查询。请注意,这不仅是“限制从表中选择的行数” ...,这可能就是为什么当您这么说时,面试官看上去很可疑!
如果确实需要显示整个所选记录集,但要以简化形式(例如,求和,求平均值,排序,整理等)显示,请在查询中进行简化,而不是通过获取记录并在其中进行客户。
按照Ivan的建议调整fetchSize()
。
还有一些其他的想法不太可能帮助和/或需要大量的修改。
答案 1 :(得分:2)
您可以尝试将fetchSize()
的数量增加Statement/PreparedStatement
,以减少应用程序服务器/台式机与数据库服务器之间的网络往返次数。
您可以启动多个线程来查询一些数据,然后合并来自多个线程的所有数据。
答案 2 :(得分:0)
编辑:不适用于这种情况,因为id
和name
是此表上的唯一列,但对其他读者来说仍然有用。>
如果创建同时覆盖id
和name
的索引,则数据库甚至可以不必读取表,因此可以使用该索引更快地读取数据。
请参阅此link,以获得更全面的说明。
如果索引包含您请求的所有列,则甚至不需要查看表。这个概念称为索引覆盖率。