我正在试图弄清楚如何提高此查询的性能,我相信它可能是我的索引;我的一些想法是,日期可能导致表现不佳或我的订单中的索引错误。还有谁有任何其他建议如何提高非索引相关的速度?谢谢,我期待任何意见!
这是我到目前为止所尝试的内容
ALTER TABLE data ADD INDEX(data_timestamp, first,last);
ALTER table data add index(first);
ALTER table data add index(first);
ALTER TABLE data add index (data_timestamp);
下面的查询(第二个)为数据库的每一行运行一个子查询,以便在每个点的瞬间获得先前的平均值
select count(*) from data where data_timestamp like '2015-01-01%'; -> 362855
select (select sum(first*last) / sum(last)
FROM data t2
WHERE data_timestamp like '2015-12-18%'
AND t2.data_timestamp <= t1.data_timestamp
), t1.*
FROM data t1
WHERE data_timestamp like '2015-12-18%';
答案 0 :(得分:2)
为获得最佳性能,您需要data_timestamp
列的索引范围扫描操作。表单查询中的谓词:
WHERE data_timestamp LIKE '2015-12-18%'
强制MySQL评估表中data_timestamp
的每个值,有效地将datetime / timestamp值转换为字符串,然后对转换后的值执行字符串比较。
如果我们使用与日期时间值进行比较的谓词,那么MySQL可以更有效地使用具有data_timestamp
作为前导列的索引。例如:
WHERE data_timestamp >= '2015-12-18'
AND data_timestamp < '2015-12-18' + INTERVAL 1 DAY
使用EXPLAIN
模式的查询的LIKE
输出将显示
type
------
index
这表明查询可以使用索引。但它正在对索引进行全面扫描,查看索引中的每个行。但是可以使用更有效的模式。通过使用范围扫描操作,我们可以允许MySQL快速消除索引中的大量行。如第二个示例中的谓词查询将(应该)显示:
type
------
range
这将改善从大型集合中提取相对较少行数的查询的性能。
更多解释,如果我没有说清楚。写作:
WHERE ts_col LIKE '2015-12-18%'
与写作
实际上相同 WHERE CONVERT(ts_col,CHAR(18)) LIKE '2015-12-18%'
这迫使MySQL对表中每个行的ts_col
中的值执行CONVERT操作。
BOTTOM LINE
不要强制从表中进行不必要的数据类型转换。而是将列与其本机数据类型进行比较。
答案 1 :(得分:0)
您可以对数据库执行“解释”查询,以弄清楚发生了什么。只需在任何查询之前写下“解释”。
不必为第一个和最后一个添加索引。您只搜索data_timestamp字段,这是您需要的唯一索引。
另一方面,您可能在日期列中使用“like%”时遇到问题。检查是否有其他替代方法可以做同样的事情。如果data_timestamp是文本列,则应向该字段添加全文索引。如果data_timestamp是日期列,请使用“between”而不是“like”。 “explain”告诉您查询使用了哪个索引。
答案 2 :(得分:0)
对于此查询,您只需要ALTER TABLE tic_data add index (data_timestamp)
。但data_timestamp
必须为CHAR
或VARCHAR
类型(您使用LIKE <string%>
进行扫描)。