我正在使用MySQL数据库。因为我在一个表中有销售数据,并且我为Date列创建了一个索引(即OrderedDate。
当我们使用像
这样的查询时,会快速检索数据SELECT CustID
,CustName
,CustPhone
FROM SalesData
WHERE OrderDate BETWEEN '2012-01-08' AND '2012-05-08';
但是为了获取特殊季度周期的详细信息,它会变慢并扫描整个表格数据。
查询就像
SELECT CustID
,CustName
,CustPhone
FROM SalesData
WHERE Quarter(OrderDate) = Quarter('2012-01-08')
AND Year(OrderDate) = Year('2012-01-08');
是否有指数季度函数(或)以任何方式加速季度周期的数据检索......?
解释声明:
第一次查询
id Selecttype table type possible_keys key key_len ref rows Extra
1 SIMPLE SalesData range csrv csrv 4 138 Using where
对于第二查询(扫描104785行数据)
id Selecttype table type possible_keys key key_len ref rows Extra
1 SIMPLE SalesData All 104785 Using where
答案 0 :(得分:0)
除非你单独存储,否则无法在mysql中索引anyFunction(OrderDate)
。
我认为你可以通过两种方式更有效地处理它:
1-从MySQL迁移到Mariadb,它有计算/虚拟列,您可以将虚拟字段设为OrderDateQuarter
和OrderDateYear
,您也可以在没有太多开销的情况下对其进行索引。
(MariaDB是一个社区开发的MySQL分支,我认为它比原生MySQL好得多)
2-您可以将OrderDateQuarter
和OrderDateYear
存储在其他列中,然后将其编入索引,您可以通过编写触发器来存储这两列OrderDate
来轻松实现。
答案 1 :(得分:0)
您自己找到了解决方案,为什么不使用它?
只需计算相关季度的边界日期,并将其与BETWEEN
一起使用:
SELECT CustID
,CustName
,CustPhone
FROM SalesData
WHERE OrderDate BETWEEN '2012-01-01' AND '2012-03-31';
您可以在应用程序中计算边界日期,也可以通过MySQL计算边界日期,如本文所示:
http://use-the-index-luke.com/sql/where-clause/obfuscation/dates?db_type=mysql