Mysql优化
我目前正在尝试优化一个MYSQL语句,这需要花费相当长的时间。运行此操作的表为600k+并且查询需要10秒以上的时间Mysql优化,sql,mysql,optimization,Sql,Mysql,Optimization,我目前正在尝试优化一个MYSQL语句,这需要花费相当长的时间。运行此操作的表为600k+并且查询需要10秒以上的时间 SELECT DATE_FORMAT( timestamp, '%Y-%m-%d' ) AS date, COUNT( DISTINCT ( email ) ) AS count FROM log WHERE timestamp > '2009-02-23' AND timestamp < '2020-01-01' AND TYPE = 'play' GROUP BY
SELECT DATE_FORMAT( timestamp, '%Y-%m-%d' ) AS date, COUNT( DISTINCT (
email
) ) AS count
FROM log
WHERE timestamp > '2009-02-23'
AND timestamp < '2020-01-01'
AND TYPE = 'play'
GROUP BY date
ORDER BY date DESC
感谢您尝试以下内容:
- 有一个单独的
列(索引),并使用该列而不是日期
列时间戳
- 在
和类型
日期
- 使用BETWEEN(不要认为这会影响速度,但更易于阅读)
date
列,并使用updatetable SET date=date(timestamp)
类型
和日期
- 有一个单独的
列(索引),并使用该列而不是日期
列时间戳
- 在
和类型
日期
- 使用BETWEEN(不要认为这会影响速度,但更易于阅读)
date
列,并使用updatetable SET date=date(timestamp)
类型
和日期
首先尝试重写以仅对类型进行筛选。然后应用您的日期范围和聚合。基本上创建一个内联视图,过滤掉键入的内容。我知道优化器很可能已经在这样做了,但在尝试提高性能时,我发现非常确定首先发生的事情是什么是有帮助的。尝试重写以仅根据类型进行过滤。然后应用您的日期范围和聚合。基本上创建一个内联视图,过滤掉键入的内容。我知道优化器很可能已经在这样做了,但是当试图提高性能时,我发现非常确定首先发生的事情是什么是有帮助的
我想,将type列从varchar转换为int会有一点帮助。+1确切地说,如果您在计算列上分组,MySQL不能使用索引。但是,根据表的大小,使用完整表扫描可能更有效。我知道用于进行完整扫描的表的百分比总是比我想象的要低得多。介于端点和端点之间,如果重写,请小心。我想将类型列从varchar转换为int会有一点帮助。+1确切地说,如果在计算列上分组,MySQL不能使用索引。但是,根据表的大小,使用完整表扫描可能更有效。我知道用于进行完整扫描的表的百分比总是比我想象的要低得多。介于端点和端点之间,如果重写,请注意这一点。能否用SQL代码显示当前的indexe定义,因此毫无疑问它们是如何设置的。还有,我们谈论的是什么数据量?(有多少行,多少“类型”,每个类型和时间戳有多少行?)您可以用SQL代码显示您当前的indexe定义,因此毫无疑问它们是如何设置的。还有,我们谈论的是什么数据量?(有多少行,多少“类型”,每个类型和时间戳有多少行?)
id: 1
select_type: SIMPLE
table: log
type: ref
possible_keys: type,timestamp,type_2
key: type_2
key_len: 1
ref: const
rows: 226403
Extra: Using where; Using filesort