Some queries from Web interface aren't using indexes requiring too much time on v3.1.3
还没有人认领这个 Issue。
评估
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 新手友好度
- 35/100
- Issue 类型
- 缺陷
- 描述清晰度
- 需要澄清
- 活跃度
- 停滞
- 技术栈
- mysql, python
- 领域
- backend, databases, performance
调研方向
首先重现 Web 界面查询 state=*\u0026archive=true,并针对 MySQL 使用 EXPLAIN 运行提供的 SQL。跟踪生成此语句的查询路径,然后验证该查询使用了合适的索引,并且根据 slow log 不再需要超过 90 秒。
由索引模型根据 Issue 内容生成。
描述
This query: state=*&archive=true
Is producing a complex sql statement that it is not using indexes and are taking a long time to complete:
explain SELECT (coalesce((SELECT count FROM patchwork_patchtag WHERE patchwork_patchtag.patch_id=patchwork_patch.id AND patchwork_patchtag.tag_id=1), 0)) AS `tag_1_count`, (coalesce((SELECT count FROM patchwork_patchtag WHERE patchwork_patchtag.patch_id=patchwork_patch.id AND patchwork_patchtag.tag_id=2), 0)) AS `tag_2_count`, (coalesce((SELECT count FROM patchwork_patchtag WHERE patchwork_patchtag.patch_id=patchwork_patch.id AND patchwork_patchtag.tag_id=3), 0)) AS `tag_3_count`, (coalesce((SELECT count FROM patchwork_patchtag WHERE patchwork_patchtag.patch_id=patchwork_patch.id AND patchwork_patchtag.tag_id=4), 0)) AS `tag_4_count`, (coalesce((SELECT count FROM patchwork_patchtag WHERE patchwork_patchtag.patch_id=patchwork_patch.id AND patchwork_patchtag.tag_id=5), 0)) AS `tag_5_count`, `patchwork_patch`.`id`, `patchwork_patch`.`msgid`, `patchwork_patch`.`date`, `patchwork_patch`.`submitter_id`, `patchwork_patch`.`project_id`, `patchwork_patch`.`name`, `patchwork_patch`.`delegate_id`, `patchwork_patch`.`state_id`, `patchwork_patch`.`series_id`, `patchwork_person`.`id`, `patchwork_person`.`email`, `patchwork_person`.`name`, `patchwork_person`.`user_id`, `auth_user`.`id`, `auth_user`.`password`, `auth_user`.`last_login`, `auth_user`.`is_superuser`, `auth_user`.`username`, `auth_user`.`first_name`, `auth_user`.`last_name`, `auth_user`.`email`, `auth_user`.`is_staff`, `auth_user`.`is_active`, `auth_user`.`date_joined`, `patchwork_state`.`id`, `patchwork_state`.`name`, `patchwork_state`.`slug`, `patchwork_state`.`ordering`, `patchwork_state`.`action_required`, `patchwork_series`.`id`, `patchwork_series`.`name` FROM `patchwork_patch` INNER JOIN `patchwork_person` ON (`patchwork_patch`.`submitter_id` = `patchwork_person`.`id`) LEFT OUTER JOIN `auth_user` ON (`patchwork_patch`.`delegate_id` = `auth_user`.`id`) LEFT OUTER JOIN `patchwork_state` ON (`patchwork_patch`.`state_id` = `patchwork_state`.`id`) LEFT OUTER JOIN `patchwork_series` ON (`patchwork_patch`.`series_id` = `patchwork_series`.`id`) WHERE (`patchwork_patch`.`project_id` = 1 AND `patchwork_patch`.`archived`) ORDER BY `patchwork_patch`.`date` DESC LIMIT 1000;
+------+--------------------+--------------------+--------+----------------------------------------------------------------------+--------------------------+---------+----------------------------------------+-------+-----------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+--------------------+--------------------+--------+----------------------------------------------------------------------+--------------------------+---------+----------------------------------------+-------+-----------------------------+
| 1 | PRIMARY | patchwork_patch | ref | patchwork_patch_499df97c,patchwork_patch_1a37f020,patch_covering_idx | patchwork_patch_499df97c | 4 | const | 30607 | Using where; Using filesort |
| 1 | PRIMARY | patchwork_person | eq_ref | PRIMARY | PRIMARY | 4 | patchwork.patchwork_patch.submitter_id | 1 | |
| 1 | PRIMARY | auth_user | eq_ref | PRIMARY | PRIMARY | 4 | patchwork.patchwork_patch.delegate_id | 1 | Using where |
| 1 | PRIMARY | patchwork_state | eq_ref | PRIMARY | PRIMARY | 4 | patchwork.patchwork_patch.state_id | 1 | Using where |
| 1 | PRIMARY | patchwork_series | eq_ref | PRIMARY | PRIMARY | 4 | patchwork.patchwork_patch.series_id | 1 | Using where |
| 6 | DEPENDENT SUBQUERY | patchwork_patchtag | eq_ref | patch_id | patch_id | 8 | patchwork.patchwork_patch.id,const | 1 | |
| 5 | DEPENDENT SUBQUERY | patchwork_patchtag | eq_ref | patch_id | patch_id | 8 | patchwork.patchwork_patch.id,const | 1 | |
| 4 | DEPENDENT SUBQUERY | patchwork_patchtag | eq_ref | patch_id | patch_id | 8 | patchwork.patchwork_patch.id,const | 1 | |
| 3 | DEPENDENT SUBQUERY | patchwork_patchtag | eq_ref | patch_id | patch_id | 8 | patchwork.patchwork_patch.id,const | 1 | |
| 2 | DEPENDENT SUBQUERY | patchwork_patchtag | eq_ref | patch_id | patch_id | 8 | patchwork.patchwork_patch.id,const | 1 | |
+------+--------------------+--------------------+--------+----------------------------------------------------------------------+--------------------------+---------+----------------------------------------+-------+-----------------------------+
As reported by mysql slow log, it takes more than 1:30 mins to complete:
# Thread_id: 5213 Schema: patchwork QC_hit: No
# Query_time: 92.553408 Lock_time: 0.000355 Rows_sent: 1000 Rows_examined: 101124
# Rows_affected: 0 Bytes_sent: 367857
Issue noticed at https://patchwork.linuxtv.org.
- 主要语言
- Python
- 星标
- 317
- 派生
- 91
- PR 合并指标
- 30 天内没有已合并 PR
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
getpatchwork/patchwork 的其他 Issue
-
难度 2/5 1-3 小时 新手友好度 68/100
getpatchwork/patchwork#668 ·
-
bug web-ui
难度 2/5 1-3 小时 新手友好度 74/100
getpatchwork/patchwork#546 · 2 条评论 ·
-
难度 3/5 1-2 天 新手友好度 52/100
getpatchwork/patchwork#664 ·
-
难度 4/5 3-5 天 新手友好度 48/100
getpatchwork/patchwork#663 ·
-
难度 3/5 1-2 天 新手友好度 45/100
getpatchwork/patchwork#645 ·
查看 getpatchwork/patchwork 的全部 Issue
相似的 Issue
-
Add: hunch 未关闭
难度 2/5 1-3 小时 新手友好度 74/100
AbdelStark/awesome-typesafe#104 ·
-
enhancement
难度 2/5 1-3 小时 新手友好度 72/100
-
难度 2/5 1-3 小时 新手友好度 68/100
DiamondLightSource/dodal#2211 ·
-
难度 2/5 1-3 小时 新手友好度 88/100
openml/openml-python#1749 ·
-
难度 2/5 1-3 小时 新手友好度 88/100
sipyourdrink-ltd/bernstein#6191 ·