Базы данных допускают нули, что часто является началом трагедии (1-минутная серия)

задняя часть база данных MySQL

Поля базы данных допускают нулевые значения, и вы столкнетесь с некоторыми проблемами.Давайте поговорим о некоторых знаниях, включенных сюда.

подготовка данных:

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.