通过减慢具有多个联接的查询和对较大结果集的限制/偏移来排序

问题描述

当结果很大时,以下查询我花了很长时间来处理麻烦。限制和偏移可以更改,因为它与分页一起使用。 capture_timestamp上的范围也可以更改,但是在此示例中查找所有结果(介于0和9999999999之间-该字段是utc时间戳的int)。问题似乎是ORDER BY占用了大部分处理时间。看起来它使用user_id进行表联接,但是从不使用任何顺序。

logs表上,我具有以下索引:

PRIMARY : activity_id
user_id : (user_id,capture_timestamp)
capture_timestamp : capture_timestamp (added this to see if by itself would make a difference - it did not)

所有ON联接都有键设置。

例如,该特定查询具有2440801个结果(日志表本身当前包含18332067行),但是我仅显示了按capture_timestamp排序的前10个,返回结果大约需要7秒钟。

SELECT
    logs.activity_id,users.username,computers.computer_name,computers.os,logs.event_title,logs.event_target,logs.capture_timestamp

FROM computers
INNER JOIN users
    ON users.computer_id = computers.computer_id
INNER JOIN logs
    ON logs.user_id = users.user_id AND logs.capture_timestamp BETWEEN :cw_date_start AND :cw_date_end
    
WHERE computers.account_id = :cw_account_id AND computers.status = 1
ORDER BY logs.capture_timestamp DESC
LIMIT 0,10

分析:

Array
(
    [0] => Array
        (
            [ANALYZE] => {
  "query_block": {
    "select_id": 1,"r_loops": 1,"r_total_time_ms": 6848.2,"filesort": {
      "sort_key": "logs.capture_timestamp desc","r_total_time_ms": 431.25,"r_limit": 10,"r_used_priority_queue": true,"r_output_rows": 11,"temporary_table": {
        "table": {
          "table_name": "computers","access_type": "ref","possible_keys": ["PRIMARY","account_id_2","account_id"],"key": "account_id_2","key_length": "4","used_key_parts": ["account_id"],"ref": ["const"],"rows": 294,"r_rows": 294,"r_total_time_ms": 0.4544,"filtered": 100,"r_filtered": 100,"attached_condition": "computers.`status` = 1"
        },"table": {
          "table_name": "users","unique_filter"],"key": "unique_filter","used_key_parts": ["computer_id"],"ref": ["db.computers.computer_id"],"r_loops": 294,"rows": 1,"r_rows": 3.415,"r_total_time_ms": 0.7054,"using_index": true
        },"table": {
          "table_name": "logs","possible_keys": ["user_id","capture_timestamp"],"key": "user_id","used_key_parts": ["user_id"],"ref": ["db.users.user_id"],"r_loops": 1004,"rows": 424,"r_rows": 2431.1,"r_total_time_ms": 4745.3,"index_condition": "logs.capture_timestamp between '0' and '9999999999'"
        }
      }
    }
  }
}
        )

)

我在这里可以做些什么来加快这些速度吗?当结果集较小时,尽管我猜那是因为没有太多要做的排序,但是一切几乎都是即时的。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...