MySQL использует индексы на наличие? - PullRequest
4 голосов
/ 14 апреля 2011

Часть моего запроса выглядит так:

HAVING date > '2011-04-13 04:28:03'

Переменная даты индексируется, это как-то влияет на запрос?

EXPLAIN EXTENDED, похоже, не использует индекс, но я не знаю, только ли это потому, что у меня есть 4 строки в базе данных, с которой я тестирую.

Мой запрос:

SELECT AVG(slen) FROM
(
SELECT date, COUNT(id) as slen
FROM table
WHERE product_id = 2830
GROUP BY id
HAVING date > '2011-04-13 04:28:02'
) as T

Есть несколько строк с разными значениями даты. Я хочу выбрать группы идентификаторов с датой> '2011-04-13 04:28:02'. Затем я хочу получить среднее число строк, принадлежащих группе, без условия даты .

Между прочим, запрос пока не работает.

Меня также беспокоило, будет ли дата> '2011-04-13 04:28:02' использовать индекс моего столбца даты.

Из этого набора данных:

sid             datelast                product_id
782240551706    2011-04-13 00:51:52     2830
782240551706    2011-04-13 04:05:48     2830
782240551706    2011-04-13 04:28:03     2830
111111111111    2011-04-13 00:50:30     2830

Желаемый результат:

Следует выбрать группу с идентификатором 782240551706, а среднее значение должно составлять 3.

Следующий запрос дает желаемый результат:

SELECT AVG(slen) FROM
(
SELECT date, COUNT(id) as slen
FROM table
WHERE product_id = 2830
GROUP BY id
HAVING **max(date)** > '2011-04-13 04:28:02'
) as T

Ответы [ 3 ]

1 голос
/ 14 апреля 2011

Например:

SELECT 
    column1, 
    count(column2) as count 
FROM table 
GROUP BY column1 
HAVING count > 1

Количество рассчитывается по вашему запросу. Это не индексируется в вашем случае. Вы можете поменять предложение has на предложение where.

1 голос
/ 14 апреля 2011

HAVING используется вместе с GROUP BY, поэтому это производная таблица. Я не вижу, как будет индекс для использования.

0 голосов
/ 14 апреля 2011

Этот запрос не имеет смысла, так как столбец "date" находится в GROUP BY, но не является ни агрегатом, ни предложением GROUP BY.

Любая обычная база данных SQL отклонит его;mysql отклонил бы это, если бы в строгом режиме.

В этом случае поведение в основном не определено.Не делай этого.

Я почти уверен, что ты хочешь, ГДЕ фильтровать твои строки, а не ХАВИРОВАТЬ.И вы не хотите указывать дату в списке столбцов, вместо этого попробуйте min (date) или max (date).

И нет, HAVING не будет использовать индекс, потому что ему нужно выполнить GROUP BYчтобы найти группы, которые соответствуют.Обычно лучше использовать WHERE, и вы будете использовать HAVING только для агрегата (например, HAVING COUNT (*)> 1)

...