Это 11-й день моего участия в ноябрьском испытании обновлений. Узнайте подробности события:Вызов последнего обновления 2021 г.
написать впереди
Когда новый коллега пришел и спросил меня, что интересного в том, где 1=1, это было бессмысленно, я рассмеялся. Позвольте мне объяснить сегодня.
where 1=1
Первый взгляд на кусок кода
<select id="queryBookInfo" parameterType="com.ths.platform.entity.BookInfo" resultType="java.lang.Integer">
select count(id) from t_book t where 1=1
<if test="title !=null and title !='' ">
AND title = #{title}
</if>
<if test="author !=null and author !='' ">
AND author = #{author}
</if>
</select>
Приведенный выше код очень знаком, он предназначен для запроса общего количества элементов, соответствующих условиям. В mybatis тег if часто используется для оценки условий после предложения where.Чтобы первое поле не было пустым, будет сообщено об ошибках SQL. Правильно, когда вы сталкиваетесь с несколькими условиями запроса, использование where 1 = 1 может легко решить проблему, состоящую в том, что наши условия пусты, так в чем же проблема?
В Интернете есть много людей, которые говорят, что это вызовет проблемы с производительностью и может сделать индекс недействительным, поэтому давайте проверим его сегодня, чтобы увидеть, не будет ли индекс использоваться.
Измерено
Поле title проиндексировано, посмотрим через EXPLAIN
EXPLAIN SELECT * FROM t_book WHERE title = 'И в мире';
EXPLAIN SELECT * FROM t_book WHERE 1=1 AND title = 'И в мире';
Сравнивая два приведенных выше примера, мы видим, что как возможные_ключи (возможные индексы), так и ключи (фактически используемые индексы) используют индексы для поиска.
в заключении
где 1 = 1 также будет проходить через индекс, что не влияет на эффективность запроса.Написанная нами команда sql будет проанализирована и оптимизирована в свою собственную команду обработки mysql.В этом процессе бессмысленные условия, такие как 1 = 1, будут оптимизирован. Используйте объяснение EXTENDED sql для корректуры и обнаружите, что такие условия, как where1=1, будут оптимизированы оптимизатором mysql.
Затем мы можем изменить способ записи в mybatis, потому что оптимизатор mysql тоже требует времени, хотя индекса нет, но он все равно будет иметь влияние, когда объем данных большой, поэтому мы рекомендуем писать код следующим образом. :
<select id="queryBookInfo" parameterType="com.ths.platform.entity.BookInfo" resultType="java.lang.Integer">
select count(*) from t_book t
<where>
<if test="title !=null and title !='' ">
title = #{title}
</if>
<if test="author !=null and author !='' ">
AND author = #{author}
</if>
</where>
</select>
Вместо этого мы используем тег where.
значение
Спасибо за чтение, если вы чувствуете, что узнали что-то, вы можете поставить лайк и подписаться. Также добро пожаловать на любые вопросы, давайте прокомментируем ниже
давай! Увидимся в следующий раз!
Позвольте мне поделиться с вами несколькими непристойными операциями, которые я описал ранее.
скопировать объект, эта операция немного сложна!
Сухой товар! SpringBoot использует события мониторинга для реализации асинхронных операций.