使用mysql上的大量数据优化查询

时间:2019-09-04 01:19:07

标签: mysql indexing

我的表格中有超过1000万个数据,需要将其提取才能显示在报告中。数据的来源是从csv中提取的,所有数据均为文本格式。这是我的桌子上的样子:

enter image description here

我尝试仅查询限制为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列上创建索引,但仍然得到相同的结果:

enter image description here

是否有任何建议/意见,如何提高提取数据的速度。 TIA

2 个答案:

答案 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)

在搜索中将函数应用于列时,即使为该列定义了索引,它也不能使用索引。

您还应该为列使用正确的DATEDATETIME数据类型,这将要求日期以YYYY-MM-DD格式存储,而不是MM / DD / YYYY的字符串列格式。

如果您正确存储了日期,则可以执行以下操作:

SELECT DATE(time) FROM myTable
WHERE time >= '2019-09-03' AND time < '2019-09-04';

这将利用索引。