一 問題描述
今天上午發現有臺生產環境服務器的cpu使用率在30%~50%左右,分析了下早晨8點到估值時刻之間的慢查詢日誌。
top1 SQL信息如下:
執行計劃如下:
感覺post表的rows掃描條數比較多,有點可疑。
看下該索引Cardinality,發現只有88,說明重複值比較高,不適合建索引。
二 優化方法-改成強制不走該索引或刪除該索引
SELECT COUNT(DISTINCT u.id ) FROM `user` u
INNER JOIN post p IGNORE INDEX(index_CompanyId)
ON p.UserId = u.Id
AND (u.pingyin_name LIKE '%ihr%'
OR u.email_head LIKE '%ihr%'
OR u.Email LIKE '%ihr%')
WHERE
p.IsHidden = 1 AND p.Type != 0
AND p.CompanyId IN (
SELECT
UCOrganizationId
FROM
organization org
WHERE
org.IsDelete = 0 AND
org.SuperiorId = '0000'
ORDER BY
Sort
)
改後sql後的執行計劃如下:
雖然user表沒有走索引,但是執行時間由原來的2秒降爲了0.5秒。
--總結:不適宜創建的索引除了會給數據庫增加維護成本外,有時也會讓數據庫選擇錯誤的執行計劃,從而影響數據庫性能。