SQL中日志记录表的适当查询和索引

卢声远*_* Lu 1 mysql sql sql-server oracle database-agnostic

假设一个名为'log'的表,其中有大量记录.

应用程序通常通过简单的SQL检索数据:

SELECT * 
FROM log 
WHERE logLevel=2 AND (creationData BETWEEN ? AND ?)
Run Code Online (Sandbox Code Playgroud)

logLevel并且creationData有索引,但记录数量使得检索数据需要更长的时间.

我们如何解决这个问题?

Jus*_*tin 5

查看您的执行计划/"EXPLAIN PLAN"结果 - 如果您要检索大量数据,那么您可以做很少的事情来提高性能 - 您可以尝试将您的SELECT语句更改为仅包含您感兴趣的列,但是不会改变你正在做的逻辑读取的数量,因此我怀疑它只会对性能产生可忽略的影响.

如果您只检索少量记录,那么LogLevel的索引和CreationDate上的索引应该可以解决问题.

更新: SQL服务器主要用于查询大型数据库的小子集(例如,从数百万的数据库中返回单个客户记录).它并没有真正适应返回真正大型的数据集.如果你要返回的数据量真的很大,那么你只能有一定的数量,所以我不得不问:

你实际上想要实现的是什么?

  • 如果您正在向用户显示日志消息,那么他们一次只会对一个小的子集感兴趣,因此您可能还想查看有效的分页SQL数据的方法 - 如果您只返回甚至500或者一次记录它应该仍然非常快.

  • 如果您尝试进行某种统计分析,那么您可能希望将数据复制到更适合统计分析的数据存储中.(不知道是什么,这不是我的专业领域)