Улучшить производительность SQL - PullRequest
1 голос
/ 27 января 2012

Когда я запустил SQL-запрос, приведенный ниже, производительность была очень низкой.

В таблице более 400 000 строк, и у меня есть индекс в поле CheckDate.

CheckDate типа datetime

SELECT username, COUNT(*) AS TotalUser
FROM table
       WHERE DATE(CheckDate) = CURDATE() 

Как улучшитьэто?

Ответы [ 3 ]

3 голосов
/ 27 января 2012

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

SELECT username, COUNT(*) AS TotalUser
  FROM table
  WHERE CheckDate BETWEEN CURDATE() AND ADDDATE(CURDATE(), INTERVAL 1 DAY)

или, возможно,

SELECT username, COUNT(*) AS TotalUser
  FROM table
  WHERE CheckDate >= CURDATE() AND 
        CheckDate <  ADDDATE(CURDATE(), INTERVAL 1 DAY)

Посмотрите, поможет ли это.

РЕДАКТИРОВАТЬ: Или первый запрос может быть переработан как

SELECT username, COUNT(*) AS TotalUser
  FROM table
  WHERE CheckDate BETWEEN CURDATE() AND
                          ADDDATE(ADDDATE(CURDATE(), INTERVAL 1 DAY), INTERVAL -1 SECOND)

но это начинает становиться довольно уродливым, и я не уверен, разрешены ли отрицательные числа в спецификаторах INTERVAL.

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

Делитесь и наслаждайтесь.

1 голос
/ 27 января 2012

Индекс в поле CheckDate не будет использоваться из-за функции DATE.

Каждый раз, когда вы используете какую-либо функцию в столбце, индексы в этом столбце не будут использоваться.

Этоэто ситуация, когда вы должны рассмотреть вопрос о создании вычисляемого столбца в таблице с выражением DATE (CheckDate), а затем создать индекс для вычисляемого столбца (да, он будет сохранен в БД, но я уверен, что индекс будетиспользуется.)

1 голос
/ 27 января 2012

Вы не работаете с функциональным индексом. В предложении WHERE используется функция DATE(), которая не будет использовать индекс. Используйте колонку CheckDate в качестве прямого компаратора.

Это не значит, что он пойдет быстрее, но будет моим первым стартом.

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