一 问题描述
今天上午发现有台生产环境服务器的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秒。
--总结:不适宜创建的索引除了会给数据库增加维护成本外,有时也会让数据库选择错误的执行计划,从而影响数据库性能。