sql如何优化

explain select
*
from
iocar_car c
where
c.del_flag = 0
and c.car_number like CONCAT(‘%’, ‘40’, ‘%’)
and c.create_time between ‘2024-09-22T23:59:59.473’ and ‘2024-10-22T22:15:46.473’
order by
c.id desc
limit 10
高级复制
{
“id” : 1,
“select_type” : “SIMPLE”,
“table” : “c”,
“partitions” : null,
“type” : “index”,
“possible_keys” : “index_combined,idx_create_time”,
“key” : “PRIMARY”,
“key_len” : “8”,
“ref” : null,
“rows” : 20,
“filtered” : 1.41,
“Extra” : “Using where; Backward index scan”
}
根据您提供的执行计划(EXPLAIN)结果,我们可以对查询进行一些优化建议。以下是对您查询的详细分析和优化建议:

执行计划分析
查询类型(select_type):SIMPLE,表示这是一个简单的查询,没有子查询或联合查询。
表(table):c,这是您查询的表名(iocar_car 的别名)。
访问类型(type):index,表示MySQL使用了索引扫描来查找数据,但这里使用的是主键索引(PRIMARY),而不是预期的复合索引(index_combined)或时间索引(idx_create_time)。
可能的键(possible_keys):index_combined, idx_create_time,这些是MySQL认为可能用于加速查询的索引。
使用的键(key):PRIMARY,实际上MySQL使用了主键索引。
预估行数(rows):20,MySQL预估需要扫描20行数据。
过滤条件(filtered):1.41%,表示在扫描的行中,只有大约1.41%的行满足WHERE子句的条件。
额外信息(Extra):Using where; Backward index scan,表示MySQL在索引扫描过程中应用了WHERE条件,并且由于是降序扫描(Backward index scan),可能与ORDER BY子句有关。
优化建议
使用合适的索引:
您的查询中使用了car_number(带有通配符的LIKE查询)和create_time字段进行过滤。由于car_number的LIKE查询以通配符%开头,它无法使用索引进行前缀匹配。但您可以考虑对create_time字段确保有一个单独的索引或包含它的复合索引。
如果car_number字段的查询模式无法改变(即始终以通配符开头),则可能无法对其进行有效的索引优化。然而,如果有可能的话,考虑避免在LIKE查询的开头使用通配符。
创建一个复合索引,包含create_time和可能的其他过滤字段(如果它们经常在查询中一起使用),并确保索引的顺序与查询中的过滤和排序条件相匹配。
优化LIKE查询:
如前所述,由于car_number的LIKE查询以%开头,它阻止了索引的使用。如果业务逻辑允许,考虑使用全文搜索或其他字符串匹配技术。
如果car_number字段通常包含固定格式或前缀,考虑将这些固定部分作为查询的一部分,以便能够利用索引。
考虑查询的排序和限制:
您的查询按c.id降序排序并限制了结果集的大小(LIMIT 10)。如果id字段是自增的,并且与create_time字段相关(例如,新记录具有更高的ID和更新的创建时间),则排序和限制可能会帮助MySQL更快地找到所需的记录。
然而,由于使用了主键索引进行后向扫描(Backward index scan),这可能与ORDER BY子句一起导致性能问题。如果可能的话,考虑调整索引的顺序或查询的逻辑,以便能够更有效地利用索引。
检查统计信息和索引更新:
确保MySQL的统计信息是最新的,以便优化器能够做出最佳的决策。您可以使用ANALYZE TABLE命令来更新表的统计信息。
定期检查索引的使用情况和性能,并根据需要进行调整。
考虑数据库配置:
根据您的硬件和查询负载调整数据库的配置设置(如内存分配、查询缓存等)。然而,请注意,从MySQL 8.0开始,查询缓存已被弃用。
查询重写:
在某些情况下,通过重写查询(例如使用子查询、临时表或不同的连接策略)可以获得更好的性能。然而,这通常需要根据具体的查询和数据库结构进行试验和调整。
请注意,这些建议可能需要您根据您的具体业务逻辑、数据分布和查询模式进行进一步的试验和调整。在进行任何重大更改之前,请确保在安全的测试环境中验证这些更改的影响。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值