重复值较高的列上创建了索引导致cpu使用率较高问题处理

一 问题描述

今天上午发现有台生产环境服务器的cpu使用率在30%~50%左右,分析了下早晨8点到估值时刻之间的慢查询日志。

top1 SQL信息如下:

重复值较高的列上创建了索引导致cpu使用率较高问题处理_第1张图片

重复值较高的列上创建了索引导致cpu使用率较高问题处理_第2张图片

 执行计划如下:

感觉post表的rows扫描条数比较多,有点可疑。

看下该索引Cardinality,发现只有88,说明重复值比较高,不适合建索引。

重复值较高的列上创建了索引导致cpu使用率较高问题处理_第3张图片

重复值较高的列上创建了索引导致cpu使用率较高问题处理_第4张图片

 

二 优化方法-改成强制不走该索引或删除该索引

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秒。

 

--总结:不适宜创建的索引除了会给数据库增加维护成本外,有时也会让数据库选择错误的执行计划,从而影响数据库性能。

 

 

你可能感兴趣的:(MySql,学习,MySql,性能调优,Mysql,故障处理)