Почему индекс не используется для группировки по группам и / или объединения, когда в столбце существует ключ - PullRequest
0 голосов
/ 13 марта 2011

У меня есть этот запрос:

SELECT p.prodno AS id, 
       proddesc AS label 
FROM   product p 
       JOIN sales s 
         ON s.custno = 00800 
            AND s.deptno = 0 
            AND s.prodno = p.prodno 
GROUP  BY p.prodno 
ORDER  BY p.prodno ASC 

Объяснение возвращает это:

+---+-----------+------+--------+------------------------------------------------------------------------------+------------+------+----------------------------------------+------+---------+------------------------------------+
| 1 |  'SIMPLE' |  'p' |  'ALL' |  'PRIMARY'                                                                   |  ''        |  ''  |  ''                                    |  481 |  100.00 |  'Using temporary; Using filesort' |
| 1 |  'SIMPLE' |  's' |  'ref' |  'PRIMARY,in_sales_custnodeptnoprodno,in_sales_deptnocustno,in_sales_custno' |  'PRIMARY' |  '6' |  'const,const,bkp_teststats2.p.PRODNO' |   93 |  100.00 |  'Using index'                     |
+---+-----------+------+--------+------------------------------------------------------------------------------+------------+------+----------------------------------------+------+---------+------------------------------------+

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

CREATE TABLE IF NOT EXISTS `product` (
  `PRODNO` decimal(4,0) unsigned zerofill NOT NULL DEFAULT '0000',
  `PRODDESC` char(21) NOT NULL DEFAULT '',
  `UPCCODE12` decimal(12,0) unsigned zerofill NOT NULL DEFAULT '000000000000',
  PRIMARY KEY (`PRODNO`)
)

И продажи имеют следующие ключи:

PRIMARY KEY (`CUSTNO`,`DEPTNO`,`PRODNO`,`ARDATE8N`),
KEY `in_sales_custnodeptnoprodno` (`CUSTNO`,`DEPTNO`,`PRODNO`),
KEY `in_sales_deptnocustno` (`DEPTNO`,`CUSTNO`),
KEY `in_sales_custno` (`CUSTNO`),

Я хотел бы отбросить Using temporary; Using filesort, потому что вышеуказанный запрос занимает 14 секунд для таблицы данных 50G.

Обновление:

Проблема: я хочу получить уникальный список продуктов, в котором есть данные о продажах для данного custno и deptno.

1 Ответ

3 голосов
/ 13 марта 2011

База данных должна проверять каждую строку в таблице product, чтобы удовлетворить ваш запрос. Если бы он использовал индекс, он должен был бы вернуться к главной таблице для каждой строки, чтобы получить proddesc. Возвращение к основному столу («поиск по закладкам») довольно дорого. Поэтому оптимизатор запросов выбирает сканирование и сортировку основной таблицы, что мне кажется хорошим выбором.

Если вы опустите proddesc в результате, для запроса требуется только prodno. В этом случае оптимизатор запросов, вероятно, будет использовать индекс.

Вы также можете расширить индекс на products с (prodno) до (prodno, proddesc). В таком случае индекс может удовлетворить запрос без поиска в таблице.

...