2020-06-05:索引不适用的条件

1.索引列上有函数。
2.不满足最左前缀。
3.使用了不等号。

1.唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件。
2.更新非常频繁的字段不适合创建索引。
3.不会出现在 WHERE 子句中的字段不该创建索引。
4.表记录太少。

sql优化,有点沾边。如下:
福哥口诀法:尽最不范覆 不囊来字哦 (sql优化:尽量全值匹配、最佳左前缀法则、不在索引列上做任何操作、范围条件放最后、覆盖索引尽量用、
不等于要甚用、Null/Not 有影响、Like查询要当心、字符类型加引号、OR改UNION效率高)

评论

这个查询中包含了两个子查询和一个LEFT JOIN,这些操作都会对性能产生影响,特别是在大表上的时候,查询时间可能会非常长。以下是几种可能的优化方式: 1. 索引优化 确保涉及到WHERE条件和JOIN条件的列都建立了索引,这样可以加快查询速度。在这个查询中,可以考虑给tyy_rent_orders表中的OrderCreateDtime和IsDeleted列,以及tyy_changebattery_record表中的orderno和IsDeleted列添加索引。 2. 子查询优化 可以将子查询转换为JOIN子句,这样可以避免使用子查询时查询执行计划的优化问题。例如,第一个子查询可以改写为: ``` SELECT * FROM tyy_rent_orders WHERE OrderCreateDtime >= '2023-05-22 14:44:27' AND OrderCreateDtime <= '2023-05-29 14:44:27' AND IsDeleted = false ``` 第二个子查询可以改写为: ``` SELECT orderno, COUNT(ChangeDtime) as powercount FROM tyy_changebattery_record cr INNER JOIN ( SELECT RentOrderNo FROM tyy_rent_orders WHERE OrderCreateDtime >= '2023-05-22 14:44:27' AND OrderCreateDtime <= '2023-05-29 14:44:27' AND IsDeleted = false ) ro ON cr.orderno = ro.RentOrderNo WHERE cr.IsDeleted = '0' GROUP BY orderno ``` 3. 避免使用SELECT *和LEFT JOIN 在SELECT语句中避免使用SELECT *,尽量只选择需要的列,可以减少查询的数据量。另外,LEFT JOIN可能会导致性能下降,如果可以使用INNER JOIN代替,则应该尽量使用INNER JOIN。 综上所述,可以将原查询改写为以下形式: ``` SELECT aa.Id, aa.RentOrderNo, aa.RentDeviceNo, aa.RentOrg, changepowers.powercount AS changeBatteryCounts FROM ( SELECT Id, RentOrderNo, RentDeviceNo, RentOrg FROM tyy_rent_orders WHERE OrderCreateDtime >= '2023-05-22 14:44:27' AND OrderCreateDtime <= '2023-05-29 14:44:27' AND IsDeleted = false ) aa LEFT JOIN ( SELECT cr.orderno, COUNT(cr.ChangeDtime) AS powercount FROM tyy_changebattery_record cr INNER JOIN ( SELECT RentOrderNo FROM tyy_rent_orders WHERE OrderCreateDtime >= '2023-05-22 14:44:27' AND OrderCreateDtime <= '2023-05-29 14:44:27' AND IsDeleted = false ) ro ON cr.orderno = ro.RentOrderNo WHERE cr.IsDeleted = '0' GROUP BY cr.orderno ) changepowers ON aa.RentOrderNo = changepowers.orderno ORDER BY aa.RentOrderNo DESC ``` 这个优化后的查询中,我们避免了使用SELECT *,而是只选择了需要的列。另外,我们将子查询转换为JOIN子句,避免使用LEFT JOIN,同时在WHERE和JOIN条件上都使用了索引
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

福大大架构师每日一题

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

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

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

打赏作者

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

抵扣说明:

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

余额充值