日期字段上的MySQL索引

时间:2013-07-08 06:51:51

标签: mysql indexing sql-date-functions

我正在使用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

2 个答案:

答案 0 :(得分:0)

除非你单独存储,否则无法在mysql中索引anyFunction(OrderDate)

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

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

2-您可以将OrderDateQuarterOrderDateYear存储在其他列中,然后将其编入索引,您可以通过编写触发器来存储这两列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