繁体   English   中英

MySQL性能调优

[英]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必须为CHARVARCHAR类型(使用LIKE <string%>扫描)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM