[英]Mysql performance tuning
我试图弄清楚如何提高此查询的性能,并且我相信这可能是我的索引; 我的一些想法是日期可能导致性能不佳,或者索引顺序错误。 还有没有其他人建议如何提高与索引无关的速度? 谢谢,我期待任何输入!
到目前为止,这是我尝试过的
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%';
为了获得最佳性能,您需要对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
使用LIKE
模式的查询的EXPLAIN
输出将显示
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操作。
底线
不要强制表中列的不必要的数据类型转换。 而是将列与其本机数据类型进行比较。
您可以对数据库进行“解释”查询,以了解正在发生的情况。 只需在任何查询之前写“说明”即可。
不必为第一个和最后一个添加索引。 您仅在data_timestamp字段中进行搜索,因此这是您唯一需要的一个索引。
另一方面,在日期列中使用“ like%”可能会遇到问题。 检查是否还有其他替代方法可以执行此操作。 如果data_timestamp是文本列,则应向该字段添加全文本索引。 如果data_timestamp是日期列,请使用“ between”代替“ like”。 “解释”告诉您查询使用哪个索引。
对于此查询,您仅需要ALTER TABLE tic_data add index (data_timestamp)
。 但是data_timestamp
必须为CHAR
或VARCHAR
类型(使用LIKE <string%>
扫描)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.