Mysql Query Улучшение производительности - PullRequest
5 голосов
/ 07 октября 2011

У меня есть следующий запрос:

SELECT COUNT(sid),fDate,COUNT(DISTINCT(cid)) 
    FROM forwarding  
    WHERE fDate BETWEEN "2011-06-01" AND "2011-06-30" 
    GROUP BY fDate

Объяснение дает мне следующий вывод:

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   SIMPLE  forwarding  index   fDate,fDate_2   fDate_2 3       1481127 Using where

Вы видите, что данных много.Общее рабочее время составляет 12 секунд.Как я могу улучшить производительность?Я не знаю, что я могу сделать больше, как установить индекс.

Вот мои индексы для этой таблицы:

fDate (fDate, f_shop)
fDate2(dDate),
f_shop(f_shop)

Спасибо за вашу помощь.

ОБНОВЛЕНИЕ:

Теперь я добавил столбец в мое предложение where, и запрос был намного медленнее, чем раньше.

SELECT COUNT(sid),fDate,COUNT(DISTINCT(cid)) FROM forwarding 
WHERE fDate BETWEEN "2011-06-01" AND "2011-06-30"  AND f_shop=10077 GROUP BY fDate

У меня есть индекс для forwardDate и f_shop, но производительность снижается.Какое идеальное решение?Спасибо

Ответы [ 2 ]

3 голосов
/ 07 октября 2011

В дополнение к предложенному ответу ypercube, ваш запрос, где вы ищете конкретный магазин ... Я бы имел индекс на

(f_shop, fdate, cid), чтобы обеспечить все 3 части индексаиспользуются с наименьшим квалификатором предложения WHERE впереди .. в последнем примере вы включили интерес к определенному магазину ...

SELECT 
      COUNT(sid),
      fDate,
      COUNT(DISTINCT(cid)) 
   FROM 
      forwarding 
   WHERE 
          f_shop=10077 
      AND fDate BETWEEN "2011-06-01" AND "2011-06-30"
   GROUP BY 
      fDate
2 голосов
/ 07 октября 2011

Как MySQL использует индексы до сих пор отвечал на все мои вопросы, касающиеся индексов MySQL.Возможно, стоит прочитать.

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