Log in
Confluence
Spaces
People
Create
Create
Hit enter to search
Help
Online Help
Keyboard Shortcuts
Feed Builder
What’s new
Available Gadgets
About Confluence
Log in
留言板
Pages
留言板 Home
自由职业者-梳理与分析
自由职业者-梳理与分析
search
attachments
weblink
advanced
image-effects
image-attributes
Paragraph
Paragraph
Heading 1
Heading 2
Heading 3
Heading 4
Heading 5
Heading 6
Preformatted
Quote
Bold
Italic
Underline
Colour picker
More colours
Formatting
Strikethrough
Subscript
Superscript
Monospace
Clear formatting
Bullet list
Numbered list
Task list
Outdent
Indent
Align left
Align center
Align right
Page layout
Link
Table
Insert
Insert content
Files and images
Link
Markup
Horizontal rule
Task list
Date
Symbol
Insert macro
User mention
Jira Issue/Filter
Info
Status
Gallery
Table of Contents
Other macros
Page layout
No layout
Two column (simple)
Two column (simple, left sidebar)
Two column (simple, right sidebar)
Three column (simple)
Two column
Two column (left sidebar)
Two column (right sidebar)
Three column
Three column (left and right sidebars)
Undo
Redo
Find/Replace
Keyboard shortcuts help
You are not logged in. Any changes you make will be marked as
anonymous
.
This page is also being edited by
. Your changes will be merged with theirs when you save.
<h2>一、现状与问题</h2><p>痛点:自由职业者实名与非实名的在多端分页查询和导出,存在接口响应缓慢的问题</p><p>原因:业务耦合太重(连表过多)</p><h2>二、自由职业者现有相关表结构</h2><h3>1.基础表<br /><strong>customer </strong>- 自由职业者基本信息表<br /><strong>customer_group </strong>- 自由职业者分组表<br /><strong>customer_identity </strong>- 自由职业者身份关系表<br />2. 关联关系表<br /><strong>company_customer </strong>- 自由职业者与企业关系表<br /><strong>agent_customer </strong>- 自由职业者与代理商关系表<br /><strong>server_customer </strong>- 自由职业者与服务商关系表<br /><strong>customer_duty </strong>- 自由职业者与任务关系表<br /><strong>customer_phone </strong>- 自由职业者通讯手机号关系表<br /><strong>customer_bank </strong>- 自由职业者银行卡关系表(企业维度)<br /><strong>customer_alipay </strong>- 自由职业者支付宝关系表(企业维度)<br /><strong>customer_pay_account </strong>- 自由职业者收款账号关系表(自由职业者维度)</h3><p><img class="confluence-embedded-image" draggable="false" width="900" src="/download/attachments/31294129/image-2025-12-2_10-2-35.png?version=1&modificationDate=1764640954383&api=v2" data-image-src="/download/attachments/31294129/image-2025-12-2_10-2-35.png?version=1&modificationDate=1764640954383&api=v2" data-unresolved-comment-count="0" data-linked-resource-id="31294132" data-linked-resource-version="1" data-linked-resource-type="attachment" data-linked-resource-default-alias="image-2025-12-2_10-2-35.png" data-base-url="https://confluence.zuirenli.cn" data-linked-resource-content-type="image/png" data-linked-resource-container-id="31294129" data-linked-resource-container-version="8" title="留言板 > 自由职业者-梳理与分析 > image-2025-12-2_10-2-35.png" data-location="留言板 > 自由职业者-梳理与分析 > image-2025-12-2_10-2-35.png" data-image-height="861" data-image-width="935"></p><p><br /></p><h2>三、结合日志与代码进行分析</h2><h3>1.页面截图</h3><p><img class="confluence-embedded-image" draggable="false" width="1313" src="/download/attachments/31294129/image-2025-12-2_13-50-4.png?version=1&modificationDate=1764654603972&api=v2" data-image-src="/download/attachments/31294129/image-2025-12-2_13-50-4.png?version=1&modificationDate=1764654603972&api=v2" data-unresolved-comment-count="0" data-linked-resource-id="31294138" data-linked-resource-version="1" data-linked-resource-type="attachment" data-linked-resource-default-alias="image-2025-12-2_13-50-4.png" data-base-url="https://confluence.zuirenli.cn" data-linked-resource-content-type="image/png" data-linked-resource-container-id="31294129" data-linked-resource-container-version="8" title="留言板 > 自由职业者-梳理与分析 > image-2025-12-2_13-50-4.png" data-location="留言板 > 自由职业者-梳理与分析 > image-2025-12-2_13-50-4.png" data-image-height="726" data-image-width="1893"></p><p><img class="confluence-embedded-image" draggable="false" height="27" src="/download/attachments/31294129/image-2025-12-2_13-48-14.png?version=1&modificationDate=1764654493850&api=v2" data-image-src="/download/attachments/31294129/image-2025-12-2_13-48-14.png?version=1&modificationDate=1764654493850&api=v2" data-unresolved-comment-count="0" data-linked-resource-id="31294136" data-linked-resource-version="1" data-linked-resource-type="attachment" data-linked-resource-default-alias="image-2025-12-2_13-48-14.png" data-base-url="https://confluence.zuirenli.cn" data-linked-resource-content-type="image/png" data-linked-resource-container-id="31294129" data-linked-resource-container-version="8" title="留言板 > 自由职业者-梳理与分析 > image-2025-12-2_13-48-14.png" data-location="留言板 > 自由职业者-梳理与分析 > image-2025-12-2_13-48-14.png" data-image-height="27" data-image-width="1313"></p><h3>2.日志分析</h3><p><img class="confluence-embedded-image" draggable="false" height="167" src="/download/attachments/31294129/image-2025-12-2_13-48-36.png?version=1&modificationDate=1764654515953&api=v2" data-image-src="/download/attachments/31294129/image-2025-12-2_13-48-36.png?version=1&modificationDate=1764654515953&api=v2" data-unresolved-comment-count="0" data-linked-resource-id="31294137" data-linked-resource-version="1" data-linked-resource-type="attachment" data-linked-resource-default-alias="image-2025-12-2_13-48-36.png" data-base-url="https://confluence.zuirenli.cn" data-linked-resource-content-type="image/png" data-linked-resource-container-id="31294129" data-linked-resource-container-version="8" title="留言板 > 自由职业者-梳理与分析 > image-2025-12-2_13-48-36.png" data-location="留言板 > 自由职业者-梳理与分析 > image-2025-12-2_13-48-36.png" data-image-height="167" data-image-width="1773"></p><h3>3.定位到慢sql语句,以企业端和运营端语句为例</h3><p>企业端:</p><pre><span style="color: rgb(57,173,181);"><</span><span style="color: rgb(255,53,91);">select </span><span style="color: rgb(226,147,29);">id</span><span style="color: rgb(145,184,89);">="selectForCompany" </span><span style="color: rgb(226,147,29);">resultMap</span><span style="color: rgb(145,184,89);">="CustomerResult"</span><span style="color: rgb(57,173,181);">><br /></span><span style="color: rgb(57,173,181);"> </span>select <span style="color: rgb(39,39,39);">c</span>.*, <span style="color: rgb(39,39,39);">cc</span>.<span style="color: rgb(39,39,39);">group_id</span>, <span style="color: rgb(39,39,39);">cg</span>.<span style="color: rgb(39,39,39);">group_name</span>,<br /> <span style="color: rgb(97,130,184);">group_concat</span>(distinct s.id) as <span style="color: rgb(39,39,39);">server_ids</span>,<br /> <span style="color: rgb(97,130,184);">group_concat</span>(distinct s.server_name) as <span style="color: rgb(39,39,39);">server_names</span>,<br /> <span style="color: rgb(97,130,184);">group_concat</span>(distinct cp.phone) as <span style="color: rgb(39,39,39);">contact_phones</span>,<br /> <span style="color: rgb(97,130,184);">group_concat</span>(DISTINCT CASE WHEN cd.duty_type = 0 THEN '<span>众包灵工</span>' WHEN cd.duty_type = 1 THEN '<span>撮合灵工</span>' END<br /> SEPARATOR ',') as <span style="color: rgb(39,39,39);">duty_types</span>,<br /> <span style="color: rgb(97,130,184);">group_concat</span>(DISTINCT cpa.bank_card SEPARATOR ',') as <span style="color: rgb(39,39,39);">bank_card</span>,<br /> <span style="color: rgb(97,130,184);">group_concat</span>(DISTINCT cpaa.alipay_account SEPARATOR ',') as <span style="color: rgb(39,39,39);">alipay_account</span>,<br /> <span style="color: rgb(97,130,184);">IF</span>(<span style="color: rgb(39,39,39);">tsc</span>.<span style="color: rgb(39,39,39);">business_id </span>is not null, 1, 0) as <span style="color: rgb(39,39,39);">hn_tax_status<br /></span><span style="color: rgb(39,39,39);"> </span>from <span style="color: rgb(226,147,29);">customer </span><span style="color: rgb(39,39,39);">c<br /></span><span style="color: rgb(39,39,39);"> </span>left join <span style="color: rgb(226,147,29);">company_customer </span><span style="color: rgb(39,39,39);">cc </span>on <span style="color: rgb(39,39,39);">cc</span>.<span style="color: rgb(39,39,39);">id_no </span>= <span style="color: rgb(39,39,39);">c</span>.<span style="color: rgb(39,39,39);">id_no </span>and <span style="color: rgb(39,39,39);">cc</span>.<span style="color: rgb(39,39,39);">deleted </span>= 0<br /> left join <span style="color: rgb(226,147,29);">customer_group </span><span style="color: rgb(39,39,39);">cg </span>on <span style="color: rgb(39,39,39);">cg</span>.<span style="color: rgb(39,39,39);">id </span>= <span style="color: rgb(39,39,39);">cc</span>.<span style="color: rgb(39,39,39);">group_id </span>and <span style="color: rgb(39,39,39);">cg</span>.<span style="color: rgb(39,39,39);">deleted </span>= 0<br /> left join <span style="color: rgb(226,147,29);">customer_phone </span><span style="color: rgb(39,39,39);">cp </span>on <span style="color: rgb(39,39,39);">cp</span>.<span style="color: rgb(39,39,39);">id_no </span>= <span style="color: rgb(39,39,39);">c</span>.<span style="color: rgb(39,39,39);">id_no </span>and <span style="color: rgb(39,39,39);">cp</span>.<span style="color: rgb(39,39,39);">deleted </span>= 0 and <span style="color: rgb(39,39,39);">cp</span>.<span style="color: rgb(39,39,39);">company_id </span>= <span style="color: rgb(39,39,39);">cc</span>.<span style="color: rgb(39,39,39);">company_id<br /></span><span style="color: rgb(39,39,39);"> </span>left join <span style="color: rgb(226,147,29);">customer_bank </span><span style="color: rgb(39,39,39);">cpa </span>on <span style="color: rgb(39,39,39);">cpa</span>.<span style="color: rgb(39,39,39);">id_no </span>= <span style="color: rgb(39,39,39);">c</span>.<span style="color: rgb(39,39,39);">id_no </span>and <span style="color: rgb(39,39,39);">cpa</span>.<span style="color: rgb(39,39,39);">deleted </span>= 0<br /> left join <span style="color: rgb(226,147,29);">customer_alipay </span><span style="color: rgb(39,39,39);">cpaa </span>on <span style="color: rgb(39,39,39);">cpaa</span>.<span style="color: rgb(39,39,39);">id_no </span>= <span style="color: rgb(39,39,39);">c</span>.<span style="color: rgb(39,39,39);">id_no </span>and <span style="color: rgb(39,39,39);">cpa</span>.<span style="color: rgb(39,39,39);">deleted </span>= 0<br /> left join <span style="color: rgb(226,147,29);">customer_duty </span><span style="color: rgb(39,39,39);">cd </span>on <span style="color: rgb(39,39,39);">cd</span>.<span style="color: rgb(39,39,39);">id_no </span>= <span style="color: rgb(39,39,39);">c</span>.<span style="color: rgb(39,39,39);">id_no </span>and <span style="color: rgb(39,39,39);">cd</span>.<span style="color: rgb(39,39,39);">deleted </span>= 0 and <span style="color: rgb(39,39,39);">cd</span>.<span style="color: rgb(39,39,39);">company_id </span>= <span style="color: rgb(39,39,39);">cc</span>.<span style="color: rgb(39,39,39);">company_id<br /></span><span style="color: rgb(39,39,39);"> </span>left join <span style="color: rgb(226,147,29);">tax_source_config </span><span style="color: rgb(39,39,39);">tsc </span>on <span style="color: rgb(39,39,39);">tsc</span>.<span style="color: rgb(39,39,39);">business_id </span>= <span style="color: rgb(39,39,39);">cc</span>.<span style="color: rgb(39,39,39);">company_id </span>and <span style="color: rgb(39,39,39);">tsc</span>.<span style="color: rgb(39,39,39);">deleted </span>= 0<br /> left join <span style="color: rgb(226,147,29);">server_customer </span><span style="color: rgb(39,39,39);">sc </span>on <span style="color: rgb(39,39,39);">sc</span>.<span style="color: rgb(39,39,39);">id_no </span>= <span style="color: rgb(39,39,39);">c</span>.<span style="color: rgb(39,39,39);">id_no </span>and <span style="color: rgb(39,39,39);">sc</span>.<span style="color: rgb(39,39,39);">deleted </span>= 0 and <span style="color: rgb(39,39,39);">sc</span>.<span style="color: rgb(39,39,39);">company_id </span>= <span style="color: rgb(39,39,39);">cc</span>.<span style="color: rgb(39,39,39);">company_id<br /></span><span style="color: rgb(39,39,39);"> </span>left join <span style="color: rgb(226,147,29);">server </span><span style="color: rgb(39,39,39);">s </span>on <span style="color: rgb(39,39,39);">s</span>.<span style="color: rgb(39,39,39);">id </span>= <span style="color: rgb(39,39,39);">sc</span>.<span style="color: rgb(39,39,39);">server_id </span>and <span style="color: rgb(39,39,39);">s</span>.<span style="color: rgb(39,39,39);">deleted </span>= 0<br /> <span style="color: rgb(57,173,181);"><</span><span style="color: rgb(255,53,91);">where</span><span style="color: rgb(57,173,181);">><br /></span><span style="color: rgb(57,173,181);"> </span>c.deleted = 0<br /> <span style="color: rgb(57,173,181);"><</span><span style="color: rgb(255,53,91);">if </span><span style="color: rgb(226,147,29);">test</span><span style="color: rgb(145,184,89);">="param.idNos != null and param.idNos.size > 0"</span><span style="color: rgb(57,173,181);">><br /></span><span style="color: rgb(57,173,181);"> </span>and c.id_no in<br /> <span style="color: rgb(57,173,181);"><</span><span style="color: rgb(255,53,91);">foreach </span><span style="color: rgb(226,147,29);">item</span><span style="color: rgb(145,184,89);">="item" </span><span style="color: rgb(226,147,29);">index</span><span style="color: rgb(145,184,89);">="index" </span><span style="color: rgb(226,147,29);">collection</span><span style="color: rgb(145,184,89);">="param.idNos" </span><span style="color: rgb(226,147,29);">open</span><span style="color: rgb(145,184,89);">="(" </span><span style="color: rgb(226,147,29);">separator</span><span style="color: rgb(145,184,89);">="," </span><span style="color: rgb(226,147,29);">close</span><span style="color: rgb(145,184,89);">=")"</span><span style="color: rgb(57,173,181);">><br /></span><span style="color: rgb(57,173,181);"> </span><span style="color: rgb(247,109,71);">#{item}<br /></span><span style="color: rgb(247,109,71);"> </span><span style="color: rgb(57,173,181);"></</span><span style="color: rgb(255,53,91);">foreach</span><span style="color: rgb(57,173,181);">><br /></span><span style="color: rgb(57,173,181);"> </</span><span style="color: rgb(255,53,91);">if</span><span style="color: rgb(57,173,181);">><br /></span><span style="color: rgb(57,173,181);"> <</span><span style="color: rgb(255,53,91);">if </span><span style="color: rgb(226,147,29);">test</span><span style="color: rgb(145,184,89);">="param.companyIds != null and param.companyIds.size > 0"</span><span style="color: rgb(57,173,181);">><br /></span><span style="color: rgb(57,173,181);"> </span>and cc.company_id in<br /> <span style="color: rgb(57,173,181);"><</span><span style="color: rgb(255,53,91);">foreach </span><span style="color: rgb(226,147,29);">item</span><span style="color: rgb(145,184,89);">="item" </span><span style="color: rgb(226,147,29);">index</span><span style="color: rgb(145,184,89);">="index" </span><span style="color: rgb(226,147,29);">collection</span><span style="color: rgb(145,184,89);">="param.companyIds" </span><span style="color: rgb(226,147,29);">open</span><span style="color: rgb(145,184,89);">="(" </span><span style="color: rgb(226,147,29);">separator</span><span style="color: rgb(145,184,89);">="," </span><span style="color: rgb(226,147,29);">close</span><span style="color: rgb(145,184,89);">=")"</span><span style="color: rgb(57,173,181);">><br /></span><span style="color: rgb(57,173,181);"> </span><span style="color: rgb(247,109,71);">#{item}<br /></span><span style="color: rgb(247,109,71);"> </span><span style="color: rgb(57,173,181);"></</span><span style="color: rgb(255,53,91);">foreach</span><span style="color: rgb(57,173,181);">><br /></span><span style="color: rgb(57,173,181);"> </</span><span style="color: rgb(255,53,91);">if</span><span style="color: rgb(57,173,181);">><br /></span><span style="color: rgb(57,173,181);"> <</span><span style="color: rgb(255,53,91);">if </span><span style="color: rgb(226,147,29);">test</span><span style="color: rgb(145,184,89);">="param.serverIds != null and param.serverIds.size > 0"</span><span style="color: rgb(57,173,181);">><br /></span><span style="color: rgb(57,173,181);"> </span>and sc.server_id in<br /> <span style="color: rgb(57,173,181);"><</span><span style="color: rgb(255,53,91);">foreach </span><span style="color: rgb(226,147,29);">item</span><span style="color: rgb(145,184,89);">="item" </span><span style="color: rgb(226,147,29);">index</span><span style="color: rgb(145,184,89);">="index" </span><span style="color: rgb(226,147,29);">collection</span><span style="color: rgb(145,184,89);">="param.serverIds" </span><span style="color: rgb(226,147,29);">open</span><span style="color: rgb(145,184,89);">="(" </span><span style="color: rgb(226,147,29);">separator</span><span style="color: rgb(145,184,89);">="," </span><span style="color: rgb(226,147,29);">close</span><span style="color: rgb(145,184,89);">=")"</span><span style="color: rgb(57,173,181);">><br /></span><span style="color: rgb(57,173,181);"> </span><span style="color: rgb(247,109,71);">#{item}<br /></span><span style="color: rgb(247,109,71);"> </span><span style="color: rgb(57,173,181);"></</span><span style="color: rgb(255,53,91);">foreach</span><span style="color: rgb(57,173,181);">><br /></span><span style="color: rgb(57,173,181);"> </</span><span style="color: rgb(255,53,91);">if</span><span style="color: rgb(57,173,181);">><br /></span><span style="color: rgb(57,173,181);"> </</span><span style="color: rgb(255,53,91);">where</span><span style="color: rgb(57,173,181);">><br /></span><span style="color: rgb(57,173,181);"> </span>group by c.id_no<br /> order by c.customer_no desc<br /><span style="color: rgb(57,173,181);"></</span><span style="color: rgb(255,53,91);">select</span>><br /><br />涉及的表如下:<br />customer - 自由职业者主表<br />company_customer - 自由职业者与企业关系表<br />customer_group - 自由职业者分组表<br />customer_phone - 自由职业者通讯手机号关系表<br />customer_bank - 自由职业者银行卡关系表<br />customer_alipay - 自由职业者支付宝关系表<br />customer_duty - 自由职业者与任务关系表<br />tax_source_config - 税源配置表<br />server_customer - 自由职业者与服务商关系表<br />server - 服务商表<br />总共涉及10张表,通过LEFT JOIN关联查询,为企业端提供自由职业者的信息,包括分组信息、联系方式、支付账户、任务类型和税源状态等。<br /><br /><br />运营端:<br /><span style="color: rgb(57,173,181);"><</span><span style="color: rgb(255,53,91);">select </span><span style="color: rgb(226,147,29);">id</span><span style="color: rgb(145,184,89);">="selectForSaas" </span><span style="color: rgb(226,147,29);">resultMap</span><span style="color: rgb(145,184,89);">="CustomerResult"</span><span style="color: rgb(57,173,181);">><br /></span><span style="color: rgb(57,173,181);"> </span>select <span style="color: rgb(39,39,39);">c</span>.*,<br /> <span style="color: rgb(39,39,39);">tmp</span>.<span style="color: rgb(39,39,39);">server_ids</span>,<br /> <span style="color: rgb(39,39,39);">tmp</span>.<span style="color: rgb(39,39,39);">server_names</span>,<br /> <span style="color: rgb(39,39,39);">tmp</span>.<span style="color: rgb(39,39,39);">company_names</span>,<br /> <span style="color: rgb(39,39,39);">tmp</span>.<span style="color: rgb(39,39,39);">top_agent_names</span>,<br /> <span style="color: rgb(39,39,39);">tmp</span>.<span style="color: rgb(39,39,39);">contact_phones</span>,<br /> <span style="color: rgb(39,39,39);">tmp</span>.<span style="color: rgb(39,39,39);">bank_card</span>,<br /> <span style="color: rgb(39,39,39);">tmp</span>.<span style="color: rgb(39,39,39);">alipay_account</span>,<br /> <span style="color: rgb(39,39,39);">tmp</span>.<span style="color: rgb(39,39,39);">duty_types<br /></span><span style="color: rgb(39,39,39);"> </span>from<br /> (select <span style="color: rgb(39,39,39);">c</span>.<span style="color: rgb(39,39,39);">id_no</span>,<br /> <span style="color: rgb(97,130,184);">group_concat</span>(distinct s.id) as <span style="color: rgb(39,39,39);">server_ids</span>,<br /> <span style="color: rgb(97,130,184);">group_concat</span>(distinct s.server_name) as <span style="color: rgb(39,39,39);">server_names</span>,<br /> <span style="color: rgb(97,130,184);">group_concat</span>(distinct com.company_name) as <span style="color: rgb(39,39,39);">company_names</span>,<br /> <span style="color: rgb(97,130,184);">group_concat</span>(distinct a.agent_name) as <span style="color: rgb(39,39,39);">top_agent_names</span>,<br /> <span style="color: rgb(97,130,184);">group_concat</span>(distinct cp.phone) as <span style="color: rgb(39,39,39);">contact_phones</span>,<br /> <span style="color: rgb(97,130,184);">group_concat</span>(DISTINCT cpa.bank_card SEPARATOR ',') as <span style="color: rgb(39,39,39);">bank_card</span>,<br /> <span style="color: rgb(97,130,184);">group_concat</span>(DISTINCT cpaa.alipay_account SEPARATOR ',') as <span style="color: rgb(39,39,39);">alipay_account</span>,<br /> <span style="color: rgb(97,130,184);">group_concat</span>(DISTINCT<br /> CASE WHEN cd.duty_type = 0 THEN '<span>众包灵工</span>' WHEN cd.duty_type = 1 THEN '<span>撮合灵工</span>' END<br /> SEPARATOR ',') as <span style="color: rgb(39,39,39);">duty_types<br /></span><span style="color: rgb(39,39,39);"> </span>from <span style="color: rgb(226,147,29);">customer </span><span style="color: rgb(39,39,39);">c<br /></span><span style="color: rgb(39,39,39);"> </span>left join <span style="color: rgb(226,147,29);">company_customer </span><span style="color: rgb(39,39,39);">cc </span>on <span style="color: rgb(39,39,39);">cc</span>.<span style="color: rgb(39,39,39);">id_no </span>= <span style="color: rgb(39,39,39);">c</span>.<span style="color: rgb(39,39,39);">id_no </span>and <span style="color: rgb(39,39,39);">cc</span>.<span style="color: rgb(39,39,39);">deleted </span>= 0<br /> left join <span style="color: rgb(226,147,29);">company </span><span style="color: rgb(39,39,39);">com </span>on <span style="color: rgb(39,39,39);">com</span>.<span style="color: rgb(39,39,39);">id </span>= <span style="color: rgb(39,39,39);">cc</span>.<span style="color: rgb(39,39,39);">company_id </span>and <span style="color: rgb(39,39,39);">com</span>.<span style="color: rgb(39,39,39);">deleted </span>= 0<br /> left join <span style="color: rgb(226,147,29);">customer_duty </span><span style="color: rgb(39,39,39);">cd </span>on <span style="color: rgb(39,39,39);">cd</span>.<span style="color: rgb(39,39,39);">id_no </span>= <span style="color: rgb(39,39,39);">c</span>.<span style="color: rgb(39,39,39);">id_no </span>and <span style="color: rgb(39,39,39);">cd</span>.<span style="color: rgb(39,39,39);">deleted </span>= 0 and <span style="color: rgb(39,39,39);">cd</span>.<span style="color: rgb(39,39,39);">company_id </span>= <span style="color: rgb(39,39,39);">cc</span>.<span style="color: rgb(39,39,39);">company_id<br /></span><span style="color: rgb(39,39,39);"> </span>left join <span style="color: rgb(226,147,29);">customer_phone </span><span style="color: rgb(39,39,39);">cp </span>on <span style="color: rgb(39,39,39);">cp</span>.<span style="color: rgb(39,39,39);">id_no </span>= <span style="color: rgb(39,39,39);">c</span>.<span style="color: rgb(39,39,39);">id_no </span>and <span style="color: rgb(39,39,39);">cp</span>.<span style="color: rgb(39,39,39);">deleted </span>= 0 and <span style="color: rgb(39,39,39);">cp</span>.<span style="color: rgb(39,39,39);">company_id </span>= <span style="color: rgb(39,39,39);">cc</span>.<span style="color: rgb(39,39,39);">company_id<br /></span><span style="color: rgb(39,39,39);"> </span>left join <span style="color: rgb(226,147,29);">customer_bank </span><span style="color: rgb(39,39,39);">cpa </span>on <span style="color: rgb(39,39,39);">cpa</span>.<span style="color: rgb(39,39,39);">id_no </span>= <span style="color: rgb(39,39,39);">c</span>.<span style="color: rgb(39,39,39);">id_no </span>and <span style="color: rgb(39,39,39);">cpa</span>.<span style="color: rgb(39,39,39);">deleted </span>= 0<br /> left join <span style="color: rgb(226,147,29);">customer_alipay </span><span style="color: rgb(39,39,39);">cpaa </span>on <span style="color: rgb(39,39,39);">cpaa</span>.<span style="color: rgb(39,39,39);">id_no </span>= <span style="color: rgb(39,39,39);">c</span>.<span style="color: rgb(39,39,39);">id_no </span>and <span style="color: rgb(39,39,39);">cpa</span>.<span style="color: rgb(39,39,39);">deleted </span>= 0<br /> left join <span style="color: rgb(226,147,29);">agent_customer </span><span style="color: rgb(39,39,39);">ac </span>on <span style="color: rgb(39,39,39);">ac</span>.<span style="color: rgb(39,39,39);">id_no </span>= <span style="color: rgb(39,39,39);">c</span>.<span style="color: rgb(39,39,39);">id_no </span>and <span style="color: rgb(39,39,39);">ac</span>.<span style="color: rgb(39,39,39);">deleted </span>= 0<br /> left join <span style="color: rgb(226,147,29);">agent </span><span style="color: rgb(39,39,39);">a </span>on <span style="color: rgb(39,39,39);">a</span>.<span style="color: rgb(39,39,39);">id </span>= <span style="color: rgb(39,39,39);">ac</span>.<span style="color: rgb(39,39,39);">top_agent_id </span>and <span style="color: rgb(39,39,39);">a</span>.<span style="color: rgb(39,39,39);">deleted </span>= 0<br /> left join <span style="color: rgb(226,147,29);">server_customer </span><span style="color: rgb(39,39,39);">sc<br /></span><span style="color: rgb(39,39,39);"> </span>on <span style="color: rgb(39,39,39);">sc</span>.<span style="color: rgb(39,39,39);">id_no </span>= <span style="color: rgb(39,39,39);">c</span>.<span style="color: rgb(39,39,39);">id_no </span>and <span style="color: rgb(39,39,39);">sc</span>.<span style="color: rgb(39,39,39);">deleted </span>= 0 and <span style="color: rgb(39,39,39);">sc</span>.<span style="color: rgb(39,39,39);">company_id </span>= <span style="color: rgb(39,39,39);">cc</span>.<span style="color: rgb(39,39,39);">company_id<br /></span><span style="color: rgb(39,39,39);"> </span>left join <span style="color: rgb(226,147,29);">server </span><span style="color: rgb(39,39,39);">s </span>on <span style="color: rgb(39,39,39);">s</span>.<span style="color: rgb(39,39,39);">id </span>= <span style="color: rgb(39,39,39);">sc</span>.<span style="color: rgb(39,39,39);">server_id </span>and <span style="color: rgb(39,39,39);">s</span>.<span style="color: rgb(39,39,39);">deleted </span>= 0<br /> <span style="color: rgb(57,173,181);"><</span><span style="color: rgb(255,53,91);">where</span><span style="color: rgb(57,173,181);">><br /></span><span style="color: rgb(57,173,181);"> </span>c.deleted = 0<br /> <span style="color: rgb(57,173,181);"><</span><span style="color: rgb(255,53,91);">if </span><span style="color: rgb(226,147,29);">test</span><span style="color: rgb(145,184,89);">="param.idNos != null and param.idNos.size > 0"</span><span style="color: rgb(57,173,181);">><br /></span><span style="color: rgb(57,173,181);"> </span>and c.id_no in<br /> <span style="color: rgb(57,173,181);"><</span><span style="color: rgb(255,53,91);">foreach </span><span style="color: rgb(226,147,29);">item</span><span style="color: rgb(145,184,89);">="item" </span><span style="color: rgb(226,147,29);">index</span><span style="color: rgb(145,184,89);">="index" </span><span style="color: rgb(226,147,29);">collection</span><span style="color: rgb(145,184,89);">="param.idNos" </span><span style="color: rgb(226,147,29);">open</span><span style="color: rgb(145,184,89);">="(" </span><span style="color: rgb(226,147,29);">separator</span><span style="color: rgb(145,184,89);">="," </span><span style="color: rgb(226,147,29);">close</span><span style="color: rgb(145,184,89);">=")"</span><span style="color: rgb(57,173,181);">><br /></span><span style="color: rgb(57,173,181);"> </span><span style="color: rgb(247,109,71);">#{item}<br /></span><span style="color: rgb(247,109,71);"> </span><span style="color: rgb(57,173,181);"></</span><span style="color: rgb(255,53,91);">foreach</span><span style="color: rgb(57,173,181);">><br /></span><span style="color: rgb(57,173,181);"> </</span><span style="color: rgb(255,53,91);">if</span><span style="color: rgb(57,173,181);">><br /></span><span style="color: rgb(57,173,181);"> <</span><span style="color: rgb(255,53,91);">if </span><span style="color: rgb(226,147,29);">test</span><span style="color: rgb(145,184,89);">="param.companyIds != null and param.companyIds.size > 0"</span><span style="color: rgb(57,173,181);">><br /></span><span style="color: rgb(57,173,181);"> </span>and (cc.company_id in<br /> <span style="color: rgb(57,173,181);"><</span><span style="color: rgb(255,53,91);">foreach </span><span style="color: rgb(226,147,29);">item</span><span style="color: rgb(145,184,89);">="item" </span><span style="color: rgb(226,147,29);">index</span><span style="color: rgb(145,184,89);">="index" </span><span style="color: rgb(226,147,29);">collection</span><span style="color: rgb(145,184,89);">="param.companyIds" </span><span style="color: rgb(226,147,29);">open</span><span style="color: rgb(145,184,89);">="(" </span><span style="color: rgb(226,147,29);">separator</span><span style="color: rgb(145,184,89);">="," </span><span style="color: rgb(226,147,29);">close</span><span style="color: rgb(145,184,89);">=")"</span><span style="color: rgb(57,173,181);">><br /></span><span style="color: rgb(57,173,181);"> </span><span style="color: rgb(247,109,71);">#{item}<br /></span><span style="color: rgb(247,109,71);"> </span><span style="color: rgb(57,173,181);"></</span><span style="color: rgb(255,53,91);">foreach</span><span style="color: rgb(57,173,181);">><br /></span><span style="color: rgb(57,173,181);"> </span>or cc.company_id is null)<br /> <span style="color: rgb(57,173,181);"></</span><span style="color: rgb(255,53,91);">if</span><span style="color: rgb(57,173,181);">><br /></span><span style="color: rgb(57,173,181);"> <</span><span style="color: rgb(255,53,91);">if </span><span style="color: rgb(226,147,29);">test</span><span style="color: rgb(145,184,89);">="param.topAgentIds != null and param.topAgentIds.size > 0"</span><span style="color: rgb(57,173,181);">><br /></span><span style="color: rgb(57,173,181);"> </span>and ac.top_agent_id in<br /> <span style="color: rgb(57,173,181);"><</span><span style="color: rgb(255,53,91);">foreach </span><span style="color: rgb(226,147,29);">item</span><span style="color: rgb(145,184,89);">="item" </span><span style="color: rgb(226,147,29);">index</span><span style="color: rgb(145,184,89);">="index" </span><span style="color: rgb(226,147,29);">collection</span><span style="color: rgb(145,184,89);">="param.topAgentIds" </span><span style="color: rgb(226,147,29);">open</span><span style="color: rgb(145,184,89);">="(" </span><span style="color: rgb(226,147,29);">separator</span><span style="color: rgb(145,184,89);">="," </span><span style="color: rgb(226,147,29);">close</span><span style="color: rgb(145,184,89);">=")"</span><span style="color: rgb(57,173,181);">><br /></span><span style="color: rgb(57,173,181);"> </span><span style="color: rgb(247,109,71);">#{item}<br /></span><span style="color: rgb(247,109,71);"> </span><span style="color: rgb(57,173,181);"></</span><span style="color: rgb(255,53,91);">foreach</span><span style="color: rgb(57,173,181);">><br /></span><span style="color: rgb(57,173,181);"> </</span><span style="color: rgb(255,53,91);">if</span><span style="color: rgb(57,173,181);">><br /></span><span style="color: rgb(57,173,181);"> </</span><span style="color: rgb(255,53,91);">where</span><span style="color: rgb(57,173,181);">><br /></span><span style="color: rgb(57,173,181);"> </span>group by c.id_no) <span style="color: rgb(39,39,39);">tmp<br /></span><span style="color: rgb(39,39,39);"> </span>left join <span style="color: rgb(226,147,29);">customer </span><span style="color: rgb(39,39,39);">c </span>on <span style="color: rgb(39,39,39);">c</span>.<span style="color: rgb(39,39,39);">id_no </span>= <span style="color: rgb(39,39,39);">tmp</span>.<span style="color: rgb(39,39,39);">id_no<br /></span><span style="color: rgb(39,39,39);"> </span>order by <span style="color: rgb(39,39,39);">c</span>.<span style="color: rgb(39,39,39);">customer_no </span>desc<br /><span style="color: rgb(57,173,181);"></</span><span style="color: rgb(255,53,91);">select</span><span style="color: rgb(57,173,181);">><br /></span><br />涉及的表如下:<br />customer - 自由职业者主表<br />company_customer - 自由职业者与企业关系表<br />company - 企业表<br />customer_duty - 自由职业者与任务关系表<br />customer_phone - 自由职业者通讯手机号关系表<br />customer_bank - 自由职业者银行卡关系表<br />customer_alipay - 自由职业者支付宝关系表<br />agent_customer - 自由职业者与代理商关系表<br />agent - 代理商表<br />server_customer - 自由职业者与服务商关系表<br />server - 服务商表<br />总共涉及11张表,通过LEFT JOIN关联查询,获取自由职业者的信息,包括关联的企业、服务商、代理商、联系方式、收款账户和任务等信息。<br /><br /></pre><h2 class="header-iWP5WJ auto-hide-last-sibling-br" style="margin-left: 0.0px;">四、优化方案</h2><h3 class="header-iWP5WJ auto-hide-last-sibling-br">一、数据库层面优化</h3><h4 class="header-iWP5WJ auto-hide-last-sibling-br" style="margin-left: 0.0px;">1. 表结构整合</h4><ul class="auto-hide-last-sibling-br"><li style="list-style-type: disc;"><strong>收款账号表合并</strong>:将<span> </span><code>customer_bank</code>(银行收款账号表)与<span> </span><code>customer_alipay</code>(支付宝收款账号表)合并为<span> </span><code>customer_receive_account</code><span> </span>统一收款账号表,减少表关联次数,提升查询效率。</li><li style="list-style-type: disc;"><strong>关系表通用化</strong>:整合<span> </span><code>company_customer</code>、<code>agent_customer</code>、<code>server_customer</code><span> </span>三张关系表为一张通用关系表(如<span> </span><code>customer_relation</code>),通过新增<span> </span><code>relation_type</code><span> </span>字段(枚举值:COMPANY/AGENT/SERVER)区分关系类型,简化数据模型,降低多表关联复杂度。</li></ul><h4 class="header-iWP5WJ auto-hide-last-sibling-br">2. 索引优化</h4><p>针对高频查询场景,为核心字段补充索引,减少全表扫描,目前在线上环境已经加上必须的索引,目前的查询时间已经在索引的帮助下有一定减少,索引优化前30S+。</p><h3 class="header-iWP5WJ auto-hide-last-sibling-br">二、代码实现层优化</h3><p>采用先查询自由职业者主表.后异步关联的查询逻辑,通过异步线程并行查询收款账号表(<code>customer_receive_account</code>)、通用关系表(<code>customer_relation</code>)等关联数据,避免同步多表 JOIN 导致的查询阻塞,降低多表耦合与数据处理压力。</p><h3>三、业务层面优化</h3><h4><span style="font-weight: 600;letter-spacing: -0.003em;">1. 无效业务字段屏蔽</span></h4><p>因海南业务已暂停,前端展示与后端查询中均隐藏海南相关业务字段,不再执行海南业务相关的数据查询逻辑,减少无效数据处理开销。</p><h4 class="header-iWP5WJ auto-hide-last-sibling-br">2. 列表字段精简</h4><p>遵循列表展示核心信息,详情展示更多信息的原则:</p><ul class="auto-hide-last-sibling-br"><li style="list-style-type: disc;">列表页仅保留关键字段,减少数据传输量与渲染压力;</li><li style="list-style-type: disc;">非关键字段统一在详情页按需展示。</li></ul><h3 class="header-iWP5WJ auto-hide-last-sibling-br">四、导出功能优化</h3><p>基于上述数据库与代码层优化基础,针对导出场景补充异步能力:由于导出功能需获取全量数据,随着业务增长数据量会持续扩大,同步导出易出现超时、内存溢出等问题,可以采用下载提交至消息队列,后台消费者生成至下载中心的方案。</p><pre><br /><br /></pre>
Edit
Save
Close
Preview
View changes
Revert to last published version
{"serverDuration": 209, "requestCorrelationId": "cfb2f1903e41f709"}