Mysql性能调优

时间:2015-12-19 19:27:46

标签: mysql sql database performance indexing

我正在试图弄清楚如何提高此查询的性能,我相信它可能是我的索引;我的一些想法是,日期可能导致表现不佳或我的订单中的索引错误。还有谁有任何其他建议如何提高非索引相关的速度?谢谢,我期待任何意见!

这是我到目前为止所尝试的内容

 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%';

3 个答案:

答案 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必须为CHARVARCHAR类型(您使用LIKE <string%>进行扫描)。