3

我正在使用 MySQL 数据库。因为我在一个表中有销售数据,并且我为日期列(即)OrderedDate 创建了一个索引。

当我们使用这样的查询时,可以快速检索数据

SELECT CustID
       ,CustName
       ,CustPhone 
FROM   SalesData 
WHERE  OrderDate BETWEEN '2012-01-08' AND '2012-05-08';

但是为了获取 Particular Quarter cycle 的详细信息,它会变慢并扫描整个表数据。

查询就像

 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
4

2 回答 2

0

没有办法anyFunction(OrderDate)在 mysql 中建立索引,除非你单独存储它。

我认为您可以通过两种方式更有效地处理它:

1- 从 MySQL 迁移到 Mariadb,它具有计算/虚拟列,您可以将其作为虚拟字段,OrderDateQuarter并且OrderDateYear您可以在没有太多开销的情况下对它们进行索引。(MariaDB 是社区开发的 MySQL 分支,我认为它比原生 MySQL 好得多)

2-您可以将OrderDateQuarter和存储OrderDateYear在另一列中,然后对它们进行索引,您可以通过编写触发器来存储这两列来简化操作OrderDate

于 2013-07-08T07:50:21.207 回答
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

于 2013-07-08T08:15:25.890 回答