Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql优化_Sql_Mysql_Optimization - Fatal编程技术网

Mysql优化

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

我目前正在尝试优化一个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 date
ORDER BY date DESC
感谢您尝试以下内容:

  • 有一个单独的
    日期
    列(索引),并使用该列而不是
    时间戳
  • 类型
    日期
  • 使用BETWEEN(不要认为这会影响速度,但更易于阅读)
所以理想情况下你会

  • 创建一个
    date
    列,并使用
    updatetable SET date=date(timestamp)
  • 类型
    日期
  • 将您的选择更改为。。。类型=?你们之间的日期是?然后呢
  • 尝试的事项:

    • 有一个单独的
      日期
      列(索引),并使用该列而不是
      时间戳
    • 类型
      日期
    • 使用BETWEEN(不要认为这会影响速度,但更易于阅读)
    所以理想情况下你会

  • 创建一个
    date
    列,并使用
    updatetable SET date=date(timestamp)
  • 类型
    日期
  • 将您的选择更改为。。。类型=?你们之间的日期是?然后呢

  • 首先尝试重写以仅对类型进行筛选。然后应用您的日期范围和聚合。基本上创建一个内联视图,过滤掉键入的内容。我知道优化器很可能已经在这样做了,但在尝试提高性能时,我发现非常确定首先发生的事情是什么是有帮助的。

    尝试重写以仅根据类型进行过滤。然后应用您的日期范围和聚合。基本上创建一个内联视图,过滤掉键入的内容。我知道优化器很可能已经在这样做了,但是当试图提高性能时,我发现非常确定首先发生的事情是什么是有帮助的

  • 日期\格式将不使用索引

  • 您仍然可以使用下面的查询来利用时间戳列上的索引

    选择时间戳作为日期、计数(不同( 电子邮件 ))作为计数 从日志 其中时间戳>'2009-02-23 00:00:00' 时间戳<'2020-01-01 23:59:59' 和类型='play' 按日期分组 按日期说明订购

  • 打印/使用时将datetime值格式化为date

  • 日期\格式将不使用索引

  • 您仍然可以使用下面的查询来利用时间戳列上的索引

    选择时间戳作为日期、计数(不同( 电子邮件 ))作为计数 从日志 其中时间戳>'2009-02-23 00:00:00' 时间戳<'2020-01-01 23:59:59' 和类型='play' 按日期分组 按日期说明订购

  • 打印/使用时将datetime值格式化为date


  • 我想,将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