首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Mysql性能调优

Mysql性能调优
EN

Stack Overflow用户
提问于 2015-12-20 03:27:46
回答 3查看 222关注 0票数 0

我正在试图找出如何提高这个查询的性能,我相信这可能是我的索引;我的一些想法是,日期可能导致性能不佳,或者我在顺序中有错误的索引。另外,有没有人对如何提高与索引无关的速度有任何其他建议?谢谢,我期待着任何意见!

以下是我到目前为止尝试过的方法

代码语言:javascript
运行
复制
 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);

下面的查询(第二个)对数据库的每一行运行子查询,以获取每个点的先前平均值

代码语言:javascript
运行
复制
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%';
EN

回答 3

Stack Overflow用户

发布于 2015-12-20 04:09:57

为了获得最佳性能,您需要对data_timestamp列执行索引范围扫描操作。以下形式的查询中的谓词:

代码语言:javascript
运行
复制
  WHERE data_timestamp LIKE '2015-12-18%' 

强制MySQL计算表中data_timestamp的每个值,有效地将日期时间/时间戳值转换为字符串,然后对转换后的值执行字符串比较。

如果我们使用谓词与DateTime值进行比较,那么MySQL可以更有效地利用以data_timestamp作为前导列的索引。例如:

代码语言:javascript
运行
复制
  WHERE data_timestamp >= '2015-12-18'
    AND data_timestamp <  '2015-12-18' + INTERVAL 1 DAY

使用LIKE模式的查询的EXPLAIN输出将显示

代码语言:javascript
运行
复制
type
------
index

这表明查询可以使用索引。但它正在对索引进行全面扫描,查看索引中的每一行。但有一种更有效的模式可用。通过使用范围扫描操作,我们可以允许MySQL快速消除索引中的大量行。具有第二个示例中的谓词的查询将(应该)显示:

代码语言:javascript
运行
复制
type
------
range

对于从大集合中提取相对较少的行的查询,这将提高性能。

更多的解释,以防我没有说清楚。写作:

代码语言:javascript
运行
复制
  WHERE ts_col LIKE '2015-12-18%' 

实际上与写作是一样的

代码语言:javascript
运行
复制
  WHERE CONVERT(ts_col,CHAR(18)) LIKE '2015-12-18%' 

这将强制MySQL对表中每一行的ts_col中的值执行转换操作。

底线

不要强制对表中的列进行不必要的数据类型转换。相反,应该将列与它们的本机数据类型进行比较。

票数 2
EN

Stack Overflow用户

发布于 2015-12-20 03:40:36

您可以对数据库执行"explain“查询,以找出发生了什么。只要在任何查询前写上"explain“。

不需要为第一个和最后一个添加索引。您只需要在data_timestamp字段中搜索,所以这是您唯一需要的索引。

另一方面,在日期列中使用"like %“可能会出现问题。检查是否有其他替代方案来做同样的事情。如果data_timestamp是文本列,则应向该字段添加全文索引。如果data_timestamp是日期列,请使用"between“而不是"like”。"explain“告诉您查询使用了哪个索引。

票数 0
EN

Stack Overflow用户

发布于 2015-12-20 04:16:08

对于这个查询,您只需要ALTER TABLE tic_data add index (data_timestamp)。但data_timestamp必须是CHARVARCHAR类型(使用LIKE <string%>扫描)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34374510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档