Какой диапазон дат и времени работает лучше: МЕЖДУ или операторами сравнения - PullRequest
0 голосов
/ 28 ноября 2018

Я использую Mysql 5.6 и выполняю много запросов на основе даты и времени.

При сканировании записей в таблице в определенном диапазоне дат и времени, который, по вашему мнению, выполняется быстрее между двумя запросами ниже, особенно когдазначение сравнения составляет string type?Конечно, столбец даты и времени индексируется.

A.используя BETWEEN

SELECT user_id 
FROM users 
WHERE created_at  BETWEEN '2018-11-01 00:00:00' AND '2018-11-30 23:59:59'

B.используя >=, <=

SELECT user_id 
FROM users 
WHERE created_at >= '2018-11-01 00:00:00' AND '2018-11-30 23:59:59' >= created_at

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Оба запроса идентичны, и нет абсолютно никакой разницы . Цитата из спецификации SQL92 :

6) "X BETWEEN Y AND Z" is equivalent to "X>=Y AND X<=Z".
0 голосов
/ 28 ноября 2018

Полагаю, это не имеет значения, но вы можете сравнить их с опцией SHOW PROFILE MySQL.Базовое использование дает вам продолжительность различных статусов при обработке запроса, но есть более конкретные показатели для разных ресурсов.

Установите профили для сеанса:

SET profiling = 1;

Запустите вашПервая версия запроса в очень большом наборе данных и проверьте профиль с помощью:

SHOW PROFILE;

Затем повторите те же шаги для другого запроса.

Я бы повторил этот процесс несколько рази возможно в разные дни убедиться, что другие процессы, работающие на сервере, не сильно повлияют на ваши результаты и окончательное сравнение.

Это пример того, что я получил с помощью локального теста, который я сделал, нотолько чтобы показать, какие цифры вы получаете от SHOW PROFILE.Таблица была маленькой, и я запускаю запросы только один раз каждый.;)

  • для BETWEEN фильтрации

    starting    0.000045
    checking permissions    0.000005
    Opening tables  0.000011
    init    0.000020
    System lock 0.000006
    optimizing  0.000017
    statistics  0.000011
    preparing   0.000008
    executing   0.000003
    Sending data    0.000535
    end 0.000004
    query end   0.000006
    closing tables  0.000006
    freeing items   0.000015
    cleaning up 0.000009
    
  • для >= AND <= фильтрации

    starting    0.000048
    checking permissions    0.000004
    Opening tables  0.000010
    init    0.000025
    System lock 0.000005
    optimizing  0.000010
    statistics  0.000011
    preparing   0.000008
    executing   0.000003
    Sending data    0.000531
    end 0.000004
    query end   0.000005
    closing tables  0.000005
    freeing items   0.000016
    cleaning up 0.000008
    
...