Поля базы данных допускают нулевые значения, и вы столкнетесь с некоторыми проблемами.Давайте поговорим о некоторых знаниях, включенных сюда.
подготовка данных:
create table user (
id int,
name varchar(20),
index(id)
)engine=innodb;
insert into user values(1,'shenjian');
insert into user values(2,'zhangsan');
insert into user values(3,'lisi');
инструкция:
id — это индекс, неуникальный (неуникальный), допускается нуль (null).
Точка знаний 1 (разминка): Отрицательные запросы не могут попасть в индекс и приведут к полному сканированию таблицы.
explain select * from user where id!=1;
Запрос not equals для идентификатора поля индекса, как показано на рисунке выше:
(1) type=ALL, полное сканирование таблицы;
(2) rows=3, вся таблица имеет только 3 строки;
Пункт знаний 2 (выделено мной): Допускаются нулевые значения, не равные (!=) запрос, который может привести к неожиданным результатам.
insert into user(name) values('wangwu');
Сначала создайте часть данных с идентификатором NULL, вы можете видеть, что всего 4 записи.
select * from user where id!=1_;_
Не равняйте запрос снова.
Угадайте, сколько записей в результирующем наборе (всего 4 записи, не равно исключая 1 запись)?
Неправильный ответ!
В результирующем наборе всего 2 записи, и пустая запись значения не отображается в результирующем наборе.
select * from user where id!=1 or id is null;
Если вы хотите получить ожидаемый набор результатов, вы должны добавить условие или.
_Голос за кадром: _Отвратительно или нет, вы наступили на эту большую яму?
Пункт знаний 3 (дополнительно): Некоторые условия или могут привести к полному сканированию таблицы, которое должно быть оптимизировано для объединения.
explain select * from user where id=1;
запрос эквивалентности по идентификатору индексированного поля,можетНажмите на индекс, как показано выше:
(1) type=ref, взять неуникальный индекс;
(2) rows=1, считается, что сканирована 1 строка;
explain select * from user where id is null;
нулевые запросы по идентификатору индексированного поля, а такжеможетНажмите на индекс, как показано выше:
(1) type=ref, взять неуникальный индекс;
(2) rows=1, считается, что сканирована 1 строка;
explain select * from user where id=1 or id is null;
Если вы поместите его в оператор SQL и используете или для запроса, он будетполное сканирование таблицы, Как показано на фиг.1:
(1) type=ALL, полное сканирование таблицы;
(2) rows=4, вся таблица имеет только 4 строки;
explain select * from user where id=1
union
select * from user where id is null;
В настоящее время его следует оптимизировать как запрос на объединение, и его можноиндекс попадания, как показано выше:
(1) type=ref, взять неуникальный индекс;
(2) rows=1, считается, что сканирована 1 строка;
_Голос за кадром: _ALL третьей строки временной таблицы представляет собой слияние двух наборов результатов.
Суммировать
(1)отрицательное сравнение(например: !=) подниметполное сканирование таблицы;
(2) Если допускаются нулевые значения,Запросы, не равные (!=), не включают пустые строки (строки), набор результатов в это время часто не соответствует ожиданиям, и в это время часто добавляется условие или, чтобы включить результат с нулевым значением (равно нулю);
(3) или может привести к полному сканированию таблицы, которое можно оптимизировать как запрос на объединение;
(4) Добавить при построении таблицызначение по умолчанию, что позволяет избежать ямы с нулевыми значениями;
(5)explainИнструмент — это хорошо;
Надеюсь, вы все что-нибудь получите!
Голос за кадром: Эта статья протестирована на MySQL 5.6.