MySQL: Как в столбце индекса функционируют столбцы, которые могут иметь значение NULL? - PullRequest
0 голосов
/ 17 марта 2020

У меня есть два столбца в таблице MySQL, один из них startDay varchar (10) ,, как "2020-03-23", другой - orderId archer (20), оба они имеют значение null

Если я создаю объединенный индекс для (orderId, startDay)

  select * from table where orderId is null and startDay < '2020-03-23'

  select * from table where orderId is not null and startDay < '2020-03-23'

для указанных выше 2 sql операторов, у меня возникает два вопроса: 1) использует ли первое утверждение оба столбца в объединенном индексе? поскольку существует десятки миллионов строк, если оператор не использует оба, а использует только часть индекса (а именно первую), то производительность может быть низкой?

2) вторая не можете использовать объединенный индекс? почему?

1 Ответ

1 голос
/ 17 марта 2020

Первый может в полной мере использовать индекс, поскольку он имеет только одно основанное на диапазоне условие, и это относится к последнему полю в индексе.

По сути, это что-то вроде this:

  • orderId IS NULL ищет указанный индекс c в индексе, идентифицирующий все записи IS NULL,
  • , что дочерние узлы узла эффективно сортируются по startDay (вторая часть индекса)
  • диапазон узлов startDay, где startDay < '2020-03-23' легко идентифицируются.

Со вторым запросом orderId IS NOT NULL в основном идентифицирует каждый узел первого уровня, отличный от того, который идентифицирует значения IS NULL orderId .... и MySQL не будет go далее с индексации. (Он останавливается на первом ранжированном условии).

Кроме того, вопрос не в том, чтобы иметь столбец, допускающий значение NULL, а в том, что первый запрос эквивалентен условию =, а второй - <> состояние.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...