【问题标题】:How to optimize date time search in Mysql?如何优化 Mysql 中的日期时间搜索?
【发布时间】:2011-05-13 02:19:52
【问题描述】:

这是我的基本日期时间结构:

primary  key(datetime)         key
auot_id  date_time             user_id
1        2010-10-01 20:32:34    1
2        2010-10-02 20:32:34    1
3        2010-11-03 20:32:34    2
4        2010-10-04 20:32:34    1
5        2010-11-05 20:32:34    1

我想在'2010-10'user_id = '1'; 获得day(date_time) 的结果 我的 SQL 是:

SELECT * FROM datetime WHERE user_id = 1 AND DATE_FORMAT(date,'%Y-%m') = '2010-10'

EXPLAIN代码显示:

SIMPLE datetime ALL (NULL) (NULL) (NULL) (NULL) 5 Using where

所以,这行代码似乎不是很有效。如何构造表格以使我的搜索更有效??

非常感谢!!

【问题讨论】:

    标签: mysql datetime search


    【解决方案1】:

    在 WHERE 子句中的列上使用函数会妨碍有效使用该列上的索引。试试这个:

    SELECT *
    FROM `datetime`
    WHERE user_id = 1
    AND `date` >= '2010-10-01' AND `date` < '2010-11-01'
    

    (user_id, date) 上添加索引。

    【讨论】:

    • 我是 mysql 新手。所以我不确定我应该添加什么样的索引?我想我已经对它们进行了索引:INDEX date (date, user_id)
    • 你希望它反过来,因为user_id 是一个“静态”值,因为date 被传递给一个函数。
    • 请参阅dba.stackexchange.com/a/140693/39319,如果您担心午夜交易,用户可以更好地解释如何涵盖所有日期和时间段
    • 对日期/日期时间列的函数或强制转换会影响性能,并使列上的索引无效(如果您添加了索引,以提高性能)
    【解决方案2】:
    SELECT *
    FROM yourTable
    WHERE datatime
    BETWEEN '2010-10-01' AND '2010-11-01'
    

    高效且也接受索引。

    【讨论】:

      【解决方案3】:

      怎么样:

      WHERE CAST(datatime AS DATE) = '2010-10-01'
      

      或许

      WHERE CAST(datatime AS DATE) = CAST('2010-10-01' AS DATE)
      

      会不会太低效了?

      【讨论】:

      • 这与 DATE(datatime) 相同,实际上使索引无效
      猜你喜欢
      • 1970-01-01
      • 2012-10-27
      • 1970-01-01
      • 1970-01-01
      • 2016-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-05
      相关资源
      最近更新 更多