sql查询与索引

当遇到SQL查询语句如`SELECT ... FROM product_bottle b WHERE 1=1 AND b.product_name LIKE '%...%' AND b.state=? LIMIT ?`执行缓慢时,可能由于LIKE操作使索引失效。为解决此问题,可以考虑将产品名称查询转换为通过product_id使用索引进行查询。索引虽非必需,但在大数据量下能显著提高查询效率。欲了解更多,可参考:https://www.cnblogs.com/ManyQian/p/9076247.html。

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

背景:有以下一个查询语句

SELECT b.id , b.product_name,b.generate_time,b.expiry_date,b.uid,b.query_times,b.state FROM product_bottle b where 1=1 and b.product_name LIKE concat('%',?,'%') and b.state = ? limit ?,? 

查询很慢,刚开始不知道为什么,前辈说这样让索引无用武之地。

在bottle表中,存在product_name,但同时也存在product_id 。所以即使需求是根据name来查询,自己也应该通过转换来使用索引id来查询。

索引:索引是一种增强式的存在,这意味着,即使没有索引,SQL仍然可以实现应有的功能。

方法1:

SELECT * FROM
(
SELECT b.id ,b.specification_id, b.product_name,b.generate_time,b.expiry_date,b.uid,b.query_times,b.state FROM product_bottle b
LEFT JOIN `account_user` u ON u.id = b.`uid`
<if test="productName != null">
    AND b.`product_name` LIKE CONCAT('%',#{productName},'%')
</if>
LIMIT 1000
) lists
方法2:
SELECT * FROM (
    SELECT b.id ,b.specification_id, b.product_name,b.generate_time,b.expiry_date,b.uid,b.query_times,b.state FROM product_bottle b
    where 1=1
    <if test="id != null">
        and b.id = #{id}
    </if>
    <if test="state != null">
        and b.state = #{state}
    </if>
    <if test="produceDateStart != null">
        and b.generate_time >= #{produceDateStart}
    </if>
    <if test="productId != null">
        and b.specification_id in
        <foreach collection="productId" index="index" item="item" open="(" separator="," close=")">
            #{item}
         </foreach>
    </if>
    <if test="uid != null">
        and b.uid IN
        <foreach collection="uid" item="userId">
            #{userId}
        </foreach>
    </if>
    limit 500
) select_bottle
如下方法1与方法2 的对比结果:



在数据量越来越大的情况下,使用索引性能提升越明显。

深入理解延伸学习参考:https://www.cnblogs.com/ManyQian/p/9076247.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值