年列与日期范围列的查询性能如何
How will be the query performance on year column vs date range column
我有一个 Spring 启动应用程序。有一个 table(比如说发票)有 financial_year
列、invoice_date
列和其他列。我必须对此 table 进行 SELECT
查询以获取给定财政年度的所有记录,并且还会有其他条件。
我的问题是这两个查询中哪一个具有更好的性能,或者有没有其他方法可以达到相同的效果?
startDate 和 endDate 将分别是财政年度的开始日期和财政年度的结束日期。 financialYear 的格式为“2020_2021”。 invoiceDate 只是日期时间的日期部分。
SELECT * FROM invoices WHERE invoice_date BETWEEN :startDate AND :endDate
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 字节)。
我有一个 Spring 启动应用程序。有一个 table(比如说发票)有 financial_year
列、invoice_date
列和其他列。我必须对此 table 进行 SELECT
查询以获取给定财政年度的所有记录,并且还会有其他条件。
我的问题是这两个查询中哪一个具有更好的性能,或者有没有其他方法可以达到相同的效果?
startDate 和 endDate 将分别是财政年度的开始日期和财政年度的结束日期。 financialYear 的格式为“2020_2021”。 invoiceDate 只是日期时间的日期部分。
SELECT * FROM invoices WHERE invoice_date BETWEEN :startDate AND :endDate
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 字节)。