年份列与日期范围列的查询性能如何
Posted
技术标签:
【中文标题】年份列与日期范围列的查询性能如何【英文标题】:How will be the query performance on year column vs date range column 【发布时间】:2020-12-28 06:26:45 【问题描述】:我有一个 Spring Boot 应用程序。有一个表(比如发票)有financial_year
列、invoice_date
列和其他列。我必须对此表进行SELECT
查询以获取给定财政年度的所有记录,并且还会有其他 where 条件。
我的问题是这两个查询中哪一个具有更好的性能,或者有没有其他方法可以达到相同的效果?
startDate 和 endDate 将分别是财政年度的开始日期和财政年度的结束日期。 financialYear 的格式为“2020_2021”。 invoiceDate 只是 datetime 的日期部分。
SELECT * FROM invoices WHERE invoice_date BETWEEN :startDate AND :endDate
SELECT * FROM invoices WHERE financial_year = :financialYear
我的应用程序完全不同。它有路由数据源,它支持 MSSQL、mysql、PostgreSQL 和 Oracle,基于我们在不同平台上提到的数据库的用户。所以我必须考虑性能。
【问题讨论】:
【参考方案1】:两个查询看起来都不错。您需要考虑的一件事是在表上使用正确的索引。如果您的数据主要按 Financial_year 过滤,并且数据的行数超过数千行,则需要考虑为 Financial_Year 添加索引。同样的事情也适用于 invoice_date。
始终使用解释计划来跟踪查询的性能。请记住,充分了解解释计划将对您的旅程大有裨益。
【讨论】:
太棒了。也感谢您提供更多信息(“解释”) Invoice_date 将有更多不同的值,如果它包含日期和时间,它将大于 9 个字符,这意味着它的索引会更大。这并不容易,需要更深入的分析 invoice_date 只是日期【参考方案2】:[以 MySQL 为中心的答案]
简短回答:您提出的两个查询具有相同的性能。 (这假定 INDEX(invoice_date)
或 INDEX(financial_year)
是适当的。)
长答案:
但是……
一旦您离开那些有限的WHERE
子句,性能可能会发生变化:
WHERE x > 5 AND financial_year = :financialYear
INDEX(financial_year, x)
高效,但 start-enddate 版本无法高效。
GROUP BY
和/或ORDER BY
将需要重新考虑索引并且可能效率不高。
对于较新版本的 MySQL,您有一个“生成”列,该列也被索引。这相对便宜,并且允许您优化任何一种方式,而不会有两列不同步的风险。
祝你好运处理多个版本的 SQL。往往存在不兼容的差异和/或缺失的功能。
MySQL 没有位图索引,其PARTITIONing
一般对性能无用。
financial_year
可以是 ENUM
(1 字节)或 YEAR
(2 字节)。
【讨论】:
【参考方案3】:如果基数很大,通常最好考虑分区或位图索引。它们都有各自的优缺点,需要比仅 1 个查询更深入的分析。
【讨论】:
您能否提供位图索引的文档,特别是 om 日期和时间列? oracle.com/technical-resources/articles/sharma-indexes.html 来自文档“传统观点认为位图索引最适合具有低不同值的列”。我的第一眼就说不要对日期、日期时间和时间戳使用位图索引。我正在尝试寻找“为什么我需要为这些列使用位图索引?”的答案 我说的是财政年度 只有日期没有时间的情况也可以考虑以上是关于年份列与日期范围列的查询性能如何的主要内容,如果未能解决你的问题,请参考以下文章