我有一个包含大约 200 万条记录的表。它有一列包含 String
格式(类似格式)的日期值。现在我需要根据这个字符串日期列过滤记录。我尝试使用 STR_TO_DATE
,但需要很长时间才能获取记录,因为该列没有 INDEX
。
谁能帮我添加一个索引
到它?
最佳答案
将函数中的列包装在谓词中会强制 MySQL 对每一行计算该函数,从而有效地禁用可能更有效的索引查找或范围扫描。
例如,MySQL 不能使用索引范围扫描
... FROM t WHERE STR_TO_DATE(t.mycol,'%Y-%m-%d') = '2018-04-23'
^^^^^^^^^^^^ ^^^^^^^^^^^^
但是让 SQL 引用裸列将允许 MySQL 考虑在适当的索引上使用范围扫描操作...
... FROM t WHERE t.mycol = DATE_FORMAT('2018-04-23','%Y-%m-%d')
^^^^^^^
对于后一个查询,第一次切割合适的索引将是
CREATE INDEX t_IX1 ON t (mycol)
这不一定是查询的最佳索引。这实际上取决于查询。例如,覆盖索引可能是更合适的选择。
<小时/>问题提到将“日期”值存储为字符串,大概意味着 CHAR 或 VARCHAR 数据类型。请注意,MySQL 实现了 native DATE 数据类型,该数据类型是为存储“日期”值而定制设计的。
关于mysql - 在MySql中添加索引到日期字符串字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50014493/