我的表格中有超过1000万个数据,需要将其提取才能显示在报告中。数据的来源是从csv中提取的,所有数据均为文本格式。这是我的桌子上的样子:
我尝试仅查询限制为1000个,并且查询会很快显示,但是如果我要设置日期过滤器以获取例如1天的数据,则大约需要25-30秒:
SELECT STR_TO_DATE(SUBSTRING_INDEX(time, '_', 1), '%m/%d/%Y') FROM myTable
WHERE STR_TO_DATE(SUBSTRING_INDEX(time, '_', 1), '%m/%d/%Y') BETWEEN DATE('2019-9-3') AND DATE('2019-9-3');
我已经尝试在用于过滤器的time列上创建索引,但仍然得到相同的结果:
是否有任何建议/意见,如何提高提取数据的速度。 TIA
答案 0 :(得分:3)
您将日期/时间戳记存储为文本,这将迫使您执行次优操作,例如在各处调用STR_TO_DATE
。我建议添加一个新的善意datetime
列,然后对该列建立索引:
ALTER TABLE myTable ADD COLUMN time_dt DATETIME;
然后,使用STR_TO_DATE
填充它:
UPDATE myTable
SET time_dt = STR_TO_DATE(time, '%m/%d/%Y_%H:%i:%s.%f');
然后,在time_dt
上添加索引:
CREATE INDEX idx ON myTable (time_dt);
最后,重写您的查询,以使WHERE
子句是可保留的(即,以便它可以使用上面的索引):
SELECT DATE(time_dt)
FROM myTable
WHERE time_dt >= '2019-09-03' AND time_dt < '2019-09-04';
旁注:您需要在%H
格式掩码中使用STR_TO_DATE
,因为您的时间处于24小时制。
答案 1 :(得分:3)
在搜索中将函数应用于列时,即使为该列定义了索引,它也不能使用索引。
您还应该为列使用正确的DATE
或DATETIME
数据类型,这将要求日期以YYYY-MM-DD格式存储,而不是MM / DD / YYYY的字符串列格式。
如果您正确存储了日期,则可以执行以下操作:
SELECT DATE(time) FROM myTable
WHERE time >= '2019-09-03' AND time < '2019-09-04';
这将利用索引。