2013-07-08 171 views
3

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

的的数据都是快速检索,当我们使用查询像

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

但采取的细节特别四分之一周期,它变得缓慢和扫描整个表DATAS ..

查询像

SELECT CustID 
     ,CustName 
     ,CustPhone 
FROM SalesData 
WHERE Quarter(OrderDate) = Quarter('2012-01-08') 
     AND Year(OrderDate) = Year('2012-01-08'); 

无论如何索引四分之一函数(或)以任何方式加快季度周期的数据检索...?

EXPLAIN语句:

对于第一次查询

id Selecttype table  type possible_keys key key_len ref rows Extra 
    1 SIMPLE SalesData  range csrv   csrv 4    138 Using where 

对于第2个查询(扫描104785点的数据)

id Selecttype table  type possible_keys key key_len ref rows Extra 
    1 SIMPLE SalesData  All          104785 Using where 
+1

你可以在这里发布两个查询的explain语句输出,这将有助于答案.... – Namphibian

+0

用解释语句ouptut编辑问题。 – CarlJohn

回答

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

+0

感谢您的建议。我计算了季度日期并将它们与'BETWEEN'一起使用。 – CarlJohn

0

没有办法指数anyFunction(OrderDate)在MySQL,除非你的店它分开。

我觉得你可以在2种方式处理它更加高效:

1迁移从MySQL到MariaDB的,它计算/虚拟列,你可以做虚拟现场为OrderDateQuarterOrderDateYear你也可以对其进行索引,而不很多开销。 (MariaDB的是MySQL的社区开发的叉子,我思比原生的MySQL更好)

2 - 你可以存储OrderDateQuarterOrderDateYear在另一列,然后对其进行索引,你可以很容易通过编写一个触发器存储这两列OrderDate