我有一张约有2百万条记录的表格。它有一个日期值为String
格式的列(类似格式)。现在我需要根据此字符串日期列过滤记录。我尝试使用STR_TO_DATE
,但要获取记录需要很长时间,因为此列没有INDEX
。
任何人都可以帮我添加Index
吗?
答案 0 :(得分:0)
在谓词中包装函数中的列会强制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实现了一个本机DATE
数据类型,它是为了存储“日期”值而自定义设计的。