Новый коллега спросил меня, что означает «где 1 = 1».

Java задняя часть

Это 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 = 'И в мире';

image.png

EXPLAIN SELECT * FROM t_book WHERE 1=1 AND title = 'И в мире';

image.png

Сравнивая два приведенных выше примера, мы видим, что как возможные_ключи (возможные индексы), так и ключи (фактически используемые индексы) используют индексы для поиска.

в заключении

где 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 использует события мониторинга для реализации асинхронных операций.