sql查询与索引

论坛 期权论坛 脚本     
已经匿名di用户   2022-5-29 19:36   1503   0

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

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

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:81
帖子:4969
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP