sql优化案例经验总结

背景:在做公司项目是遇到的大数据量查询缓慢问题,mysql中数据表数据量高达600万,接口请求时间缓慢,平均时间22s

sql语句如下:

 SELECT
		COUNT(*) AS mCount,
		m.id id,
		m.module_name moduleName,
		m.module_code moduleCode,
		m.module_father_id moduleFatherId,
		m.module_level moduleLevel,
		m.original_router_path originalRouterPath,
		m.module_router_path moduleRouterPath,
		m.module_icon moduleIcon,
		m.module_icon moduleIconArray,
		m.`icon_2px_path` icon2pxPath,
		m.`icon_3px_path` icon3pxPath,
		m.status STATUS,
		m.module_type moduleType,
		m.url_parameter urlParameter,
		m.`open_status` openStatus
		FROM `app_module_access` ama
        LEFT JOIN `app_module` m ON ama.module_id=m.id
        WHERE ama.module_id IN (SELECT id FROM `app_module`)
       AND m.`status`='E'
        GROUP BY ama.`module_id` ORDER BY mCount DESC  LIMIT 10

分析过程:

1.首先查询app_module_access表中有无索引发现在建表是并没有建立索引,于是给where条件中的module_id建立了索引,这里需要说明一般表中的外键都需要建立索引的

2.where条件后用到了子查询SELECT id FROM `app_module`,于是我把sql语句改成了以下:

SELECT
		COUNT(*) AS mCount,
		m.id id,
		m.module_name moduleName,
		m.module_code moduleCode,
		m.module_father_id moduleFatherId,
		m.module_level moduleLevel,
		m.original_router_path originalRouterPath,
		m.module_router_path moduleRouterPath,
		m.module_icon moduleIcon,
		m.module_icon moduleIconArray,
		m.`icon_2px_path` icon2pxPath,
		m.`icon_3px_path` icon3pxPath,
		m.status STATUS,
		m.module_type moduleType,
		m.url_parameter urlParameter,
		m.`open_status` openStatus
		FROM `app_module_access` ama,`app_module` m
        WHERE ama.module_id=m.`id`
       AND m.`status`='E'
        GROUP BY ama.`module_id` ORDER BY mCount DESC  LIMIT 10

3. EXPLAIN 查询语句执行情况,这是整条查询语句已经提升到了11秒,原因是因为用到了索引

4.分析新加的索引字段起了效果,但目前查询还是有10秒,还是很慢,于是又分析了以下sql做了如下改动:

        SELECT
        ama.mCount,
        m.id id,
        m.module_name moduleName,
        m.module_code moduleCode,
        m.module_father_id moduleFatherId,
        m.module_level moduleLevel,
        m.original_router_path originalRouterPath,
        m.module_router_path moduleRouterPath,
        m.module_icon moduleIcon,
        m.module_icon moduleIconArray,
        m.`icon_2px_path` icon2pxPath,
        m.`icon_3px_path` icon3pxPath,
        m.status STATUS,
        m.module_type moduleType,
        m.url_parameter urlParameter,
        m.`open_status` openStatus
        FROM (SELECT module_id, COUNT(*) mCount FROM `app_module_access` GROUP BY module_id) ama,`app_module` m
        WHERE ama.module_id=m.`id`
        AND m.`status`='E'
        ORDER BY mCount DESC  LIMIT 10

原因是因为我需要查的a表数据并不多,而a表的数据量又非常大,与是便用子查询新生成一个第三方表,这样减少了对标字段以达到效率增益。

最后查询时间只需要1秒左右即可,记录下来以便日后查看。

今天的不开心就至于此吧!明天依旧光芒万丈鸭宝贝!!!!^_^

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

棋_Rachel

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值