年列与日期范围列的查询性能如何

How will be the query performance on year column vs date range column

我有一个 Spring 启动应用程序。有一个 table(比如说发票)有 financial_year 列、invoice_date 列和其他列。我必须对此 table 进行 SELECT 查询以获取给定财政年度的所有记录,并且还会有其他条件。

我的问题是这两个查询中哪一个具有更好的性能,或者有没有其他方法可以达到相同的效果?

startDateendDate 将分别是财政年度的开始日期和财政年度的结束日期。 financialYear 的格式为“2020_2021”。 invoiceDate 只是日期时间的日期部分。

  1. SELECT * FROM invoices WHERE invoice_date BETWEEN :startDate AND :endDate
  2. SELECT * FROM invoices WHERE financial_year = :financialYear

我的申请很不一样。它有路由数据源,它支持 MSSQL、MySQL、PostgreSQL 和 Oracle,基于我们在不同平台上提到的数据库的用户。所以我不得不考虑性能。

两个查询看起来都不错。您需要考虑的一件事是在表上使用适当的索引。如果你的数据主要是按financial_year过滤,如果数据超过几千行,你需要考虑为financial_Year添加索引。同样的事情也适用于 invoice_date。

始终使用解释计划来跟踪查询的性能。请记住,对解释计划的良好理解将对您的旅程大有裨益。

如果基数很大,通常最好考虑分区或位图索引。它们都各有利弊,需要比仅 1 个查询更深入的分析。

[MySQL-centric回答]

简答:您提出的两个查询具有相同的性能。 (这假设 INDEX(invoice_date)INDEX(financial_year) 是合适的。)

长答案:

但是...

一旦您离开这些有限的 WHERE 子句,性能 可能 会发生变化:

WHERE x > 5 AND financial_year = :financialYear

INDEX(financial_year, x)是有效率的,但是start-enddate版本无法做到高效。

GROUP BY and/or ORDER BY 需要重新考虑索引并且可能效率不高。

使用较新版本的 MySQL,您有一个“生成的”列,该列也已编入索引。这相对便宜并且允许您以任何一种方式进行优化,而没有两列不同步的风险。

祝你好运处理 SQL 的多个版本。往往存在不兼容的差异 and/or 缺失功能。

MySQL没有位图索引,它的PARTITIONing一般对性能没用。

financial_year 可以是 ENUM(1 字节)或 YEAR(2 字节)。