这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
bugs:db:2018092901 [2019/03/15 10:10] jinlong.hao [总结] |
bugs:db:2018092901 [2020/07/12 12:07] (当前版本) |
||
---|---|---|---|
行 25: | 行 25: | ||
==== 主要业务逻辑:==== | ==== 主要业务逻辑:==== | ||
- | 1. 重复线索:若有同样电话的销售线索,则新插入一条数据,将新插入的数据的first_group_id设置为第一条同样号码的线索;第一条线索的last_group_id设置为最新的一条线索id | + | - 重复线索:若有同样电话的销售线索,则新插入一条数据,将新插入的数据的first_group_id设置为第一条同样号码的线索;第一条线索的last_group_id设置为最新的一条线索id |
- | 2. 修改客户姓名: | + | - 修改客户姓名: |
- | 1. 在cust_base_info中查找对应线索id的数据,若有则更新数据,若无则插入一条数据; | + | - 在cust_base_info中查找对应线索id的数据,若有则更新数据,若无则插入一条数据; |
- | 2. 若此线索为重复线索,则所有修改只针对其first_group_id来做 | + | - 若此线索为重复线索,则所有修改只针对其first_group_id来做 |
> PS:再次吐槽这样的设计 | > PS:再次吐槽这样的设计 | ||
行 42: | 行 42: | ||
### 关键sql | ### 关键sql | ||
经过查询日志,发现出现问题的列表sql如下 | 经过查询日志,发现出现问题的列表sql如下 | ||
- | ~~~sql | + | |
+ | <code sql> | ||
select | select | ||
a.id as "id", | a.id as "id", | ||
行 66: | 行 67: | ||
a.enquire_date desc | a.enquire_date desc | ||
LIMIT 20 | LIMIT 20 | ||
- | ~~~ | + | </code> |
- | > * where条件主要是为了只取最新的一条数据 | + | > where条件主要是为了只取最新的一条数据 |
- | > * join的条件是为了保证在新线索来以前修改的客户姓名 | + | > join的条件是为了保证在新线索来以前修改的客户姓名 |
===== 问题分析与解决 ===== | ===== 问题分析与解决 ===== | ||
行 88: | 行 89: | ||
首先去掉left join cust_base_info,执行下面的sql | 首先去掉left join cust_base_info,执行下面的sql | ||
- | ~~~sql | + | <code sql> |
select | select | ||
a.id as "id", | a.id as "id", | ||
行 108: | 行 109: | ||
a.enquire_date desc | a.enquire_date desc | ||
LIMIT 20 | LIMIT 20 | ||
- | ~~~ | + | </code> |
发现速度飞快,可以确定是这个join的问题 | 发现速度飞快,可以确定是这个join的问题 | ||
行 119: | 行 120: | ||
继续查询系统日志,发现因为分页的需要,在执行列表查询以前,系统需要首先做一个count的操作,具体sql如下: | 继续查询系统日志,发现因为分页的需要,在执行列表查询以前,系统需要首先做一个count的操作,具体sql如下: | ||
- | ~~~sql | + | <code sql> |
select | select | ||
- | count(1) | + | count(1) |
from | from | ||
- | leads_info a | + | leads_info a |
left join sys_user b on | left join sys_user b on | ||
- | a.next_track_user = b.id | + | a.next_track_user = b.id |
left join cust_base_info c on | left join cust_base_info c on | ||
- | (a.id = c.leads_id | + | (a.id = c.leads_id |
- | or a.first_duplicate_id = c.leads_id) | + | or a.first_duplicate_id = c.leads_id) |
- | and c.del_flag = 0 | + | and c.del_flag = 0 |
- | ~~~ | + | </code> |
此sql的响应时间为大概9s,找到原因,发现就出在了left join cust_base_info的条件上,因为里面有or条件,故此mysql在执行的时候因为无法保证left join不增加数据条数,所以需要把所有的数据全部完成join以后才能进行count统计,果断将这个条件作了修改: | 此sql的响应时间为大概9s,找到原因,发现就出在了left join cust_base_info的条件上,因为里面有or条件,故此mysql在执行的时候因为无法保证left join不增加数据条数,所以需要把所有的数据全部完成join以后才能进行count统计,果断将这个条件作了修改: | ||
- | ~~~sql | + | <code sql> |
select | select | ||
a.id as "id", | a.id as "id", | ||
行 156: | 行 157: | ||
order by | order by | ||
a.enquire_date desc | a.enquire_date desc | ||
- | ~~~ | + | </code> |
修改后,系统性能得到飞速提升,列表页面响应时间可以控制在1s以内了。 | 修改后,系统性能得到飞速提升,列表页面响应时间可以控制在1s以内了。 |