数据库调优教程(十) 【精华章节】解决like ’%str’ 时索引不被使用的4种方法

本文详细介绍了如何解决MySQL中使用LIKE '%str%'导致索引失效的问题,提供了包括选择主键查询、应用覆盖索引、使用全文索引以及利用全文检索引擎工具在内的四种解决方案,对于大数据量表的高效模糊查询具有指导意义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

三、           索引


7.      解决like’%str’不使用模糊查询的4种方法


上一讲最后说了,只要模糊查询的模糊值在字符串前面,则不会使用索引,‘%aaa’和‘_aaa’都不会!

如下


应该说这是Mysql给程序员们开的一个玩笑。要是我的表数据量很大,而且又需要使用like’%%’这样的模糊查询来检索时,该怎么办??

接下来,笔者将会给大家分享解决这个问题的四种方法


1)    Select主键

只要Select的字段刚好是主键,那么就会使用到索引(只对innodb数据库有效)

比如下面的


### SQL性能化技巧和方法 #### 选择合适的连接算法 对于被驱动表的关联字段如果没有索引,通常会选择批量嵌套循环(BNL)算法;而当存在索引,则更倾向于使用嵌套循环连接(NLJ)算法,在这种情况下,NLJ算法相比BNL具有更高的效率[^2]。 #### 合理运用索引 为了提高查询速度,应该充分利用已有索引来减少扫描范围。例如,在涉及`LIKE`模式匹配的操作中,应当避免全模糊查询以及左模糊查询(`%...`)因为这类查询难以有效利用现有索引结构。相反地,推荐采用右模糊查询形式(`…%`)以便更好地发挥索引作用。另外,针对可避免的左模糊场景,可以通过反转字符串加上函数索引的方式将其转化为可利用索引的形式[^3]。 #### 减少必要的排序开销 由于排序是一项资源密集型任务,所以在设计SQL语句必要求返回有序的数据集除非确实需要。如果确实要进行排序操作,尽量缩小参与排序的数据规模,并尝试借助已有的索引来实现自然顺序排列从而规避显式的`ORDER BY`指令带来的额外负担。此外,当确认无需对最终结果实施特定次序安排,可以在适当位置加入`ORDER BY NULL`来明示这一点以节省计算间[^4]。 #### 明确指定所需列而非通配符* 在编写`SELECT`语句精确指出希望获取的具体字段列表而是简单依赖于星号(*)作为占位符。尽管后者看起来更加简洁易用但实际上却隐藏着潜在性能风险——数据库引擎遍历整个元数据定义去解析实际所指代的所有列名称进而增加了处理复杂度。因此,明确写出各目标属性有助于提升整体执行效能[^5]。 ```sql -- 好的做法 SELECT * FROM table_name; -- 好的做法 SELECT column1, column2, ... ,columnN FROM table_name; ```
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值