Индекс производительности запросов MySQL - PullRequest
1 голос
/ 21 октября 2011

моему следующему запросу требуется больше двух минут, и я не знаю, какой индекс лучше всего повысить производительность:

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

Объяснение результата:

id   select_type   table            type    possible_keys                                                        key       key_len    ref       rows     Extra
1    SIMPLE        sal_forwarding   index   forwardDate,forwardDate_2,forwardDate_3,forwardDate_4,forwardDate_5  f_shop    40         (NULL)    2448997  Using where; Using index

Ключ f_shop имеет следующую структуру: (f_shop, forwardDate, cid)

Какой индекс лучше всего повышает производительность моего запроса?

Большое спасибо.

UPDATE: Вот таблица Создать заявление:

CREATE TABLE `forwarding` (
  `sid` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  `f_shop` INT(11) NOT NULL,
  `f_offer` INT(11) DEFAULT NULL,
  `cid` CHAR(32) DEFAULT NULL,
  `f_partner` VARCHAR(20) NOT NULL,
   .
   . 
   .
   +8-10
   .
   .
   .
  `fDate` DATE NOT NULL,
  PRIMARY KEY (`sid`),
  KEY `f_shop` (`f_shop`,`fDate`,`cid`),
  KEY `f_partner` (`f_partner`,`fDate`),
  KEY `fDate` (`fDate`,`cid`),
  KEY `fDate_2` (`fDate`,`f_shop`),
  KEY `fDate_3` (`fDate`,`f_shop`,`f_partner`),
  KEY `fDate_4` (`fDate`,`f_partner`,`cid`),
  KEY `fDate_5` (`fDate`,`f_affiliateId`)
) ENGINE=INNODB AUTO_INCREMENT=10747233 DEFAULT CHARSET=latin1

На самом деле есть более 5 миллионов строк.

Ответы [ 4 ]

2 голосов
/ 21 октября 2011

Вам нужен составной индекс

ALTER TABLE forwarding ADD INDEX shopdate (shop, fDate)
1 голос
/ 21 октября 2011

Какой индекс лучше всего повышает производительность моего запроса?

a кластерный первичный ключ

http://dev.mysql.com/doc/refman/5.0/en/innodb-index-types.html

http://www.xaprb.com/blog/2006/07/04/how-to-exploit-mysql-index-optimizations/

MySQL и NoSQL: помогите выбрать правильный

60 миллионов записей, выберите записи за определенный месяц.Как оптимизировать базу данных?

Как избежать «использования временного» в запросах «многие ко многим»?

однако ваш текущий кластерный PK sid не поможет, так что попробуйте что-нибудь вроде:

create table forwarding
(
f_date date not null,
f_shop int unsigned not null,
sid int unsigned not null, -- added for uniqueness
...
primary key (f_date, f_shop, sid) -- clustered primary key
)
engine=innodb;

надеюсь, это поможет:)

0 голосов
/ 21 октября 2011

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

EDIT Как отмечалось в других ответах, составной индекс для shop и forwardDate - это путь. Я пропустил последнюю часть запроса из-за форматирования одной строки.

0 голосов
/ 21 октября 2011

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

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