1.場(chǎng)景一
騰訊調(diào)用我方接口進(jìn)行url封禁和查詢,并發(fā)要求50qps,測(cè)試同學(xué)使用jmeter壓測(cè)時(shí)發(fā)現(xiàn),查詢封禁信息接口,構(gòu)造20個(gè)并發(fā)后,發(fā)現(xiàn)查詢響應(yīng)變慢(>2000ms),導(dǎo)致再高的并發(fā)壓不上去不滿足客戶需求。
2. 問(wèn)題分析
通過(guò)查詢?nèi)罩?,定位到該條sql語(yǔ)句耗時(shí)較長(zhǎng),通過(guò)explain分析該sql語(yǔ)句的執(zhí)行計(jì)劃:
explain select * from forbidden_info where guid ='5af50517-f11a-4370-9ca6-03aa61d39b37'

未優(yōu)化前執(zhí)行計(jì)劃.png
下面來(lái)分析執(zhí)行計(jì)劃:
| 執(zhí)行項(xiàng) | 具體值 | 描述 |
|---|---|---|
| select_type | SIMPLE | 是一個(gè)簡(jiǎn)單查詢沒(méi)有關(guān)聯(lián)或者子查詢 |
| table | forbidden_info | 表名 |
| type | ALL | 全表掃描 |
| extra | using where | 未找到索引使用where條件過(guò)濾 |
通過(guò)以上執(zhí)行計(jì)劃分析發(fā)現(xiàn)該查詢沒(méi)有使用到索引,導(dǎo)致查詢效率低。給guid添加索引后:alter table forbidden_info add index index_guid(guid); 查看執(zhí)行計(jì)劃

添加索引后的執(zhí)行計(jì)劃.png
| 執(zhí)行項(xiàng) | 具體值 | 描述 |
|---|---|---|
| select_type | SIMPLE | 是一個(gè)簡(jiǎn)單查詢沒(méi)有關(guān)聯(lián)或者子查詢 |
| table | forbidden_info | 表名 |
| type | ref | 命中了非主鍵索引 |
| possible_keys | index_guid | 可能使用到的索引 |
| key | index_guid | 實(shí)際使用到的索引 |
| key_length | 603 | 表示索引使用的字節(jié)數(shù) |
| ref | const | 表示索引使用的字節(jié)數(shù) |
| rows | 10 | 數(shù)據(jù)庫(kù)認(rèn)為需要檢查的行數(shù),估算值,非結(jié)果行數(shù) |
| extra | using index condition | 使用了ICP索引下推技術(shù) |
添加索引后,查詢耗時(shí)基本在毫秒級(jí),整個(gè)接口的響應(yīng)從2000ms下降到200ms左右