Почему этот результат не разрешен с использованием только индексов? - PullRequest
2 голосов
/ 03 января 2012

Схема:

CREATE TABLE IF NOT EXISTS `tx_hep_homes_attributes_mm` (
  `uid_local` int(11) NOT NULL DEFAULT '0',
  `uid_foreign` int(11) NOT NULL DEFAULT '0',
  `tablenames` varchar(30) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `sorting` int(11) NOT NULL DEFAULT '0',
  KEY `uid_local` (`uid_local`),
  KEY `uid_foreign` (`uid_foreign`),
  KEY `uid_local_foreign` (`uid_local`,`uid_foreign`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Пример ввода:

INSERT INTO `tx_hep_homes_attributes_mm` (`uid_local`, `uid_foreign`, `tablenames`, `sorting`) VALUES
(2, 4, '', 3),
(2, 1, '', 2),
(2, 2, '', 1),
(1, 2, '', 5),
(1, 3, '', 4),
(1, 4, '', 3),
(1, 7, '', 2),
(1, 8, '', 1);

Запрос:

SELECT amm.uid_local, 
       amm.uid_foreign 
FROM   tx_hep_homes_attributes_mm amm 
       JOIN (SELECT 1 AS att_id 
             UNION 
             SELECT 4 AS att_id 
             UNION 
             SELECT 13 AS att_id 
             UNION 
             SELECT 22 AS att_id 
             UNION 
             SELECT 12 AS att_id)d1 
         ON d1.att_id = amm.uid_foreign 
       JOIN (SELECT 1 AS home_id 
             UNION 
             SELECT 2 AS home_id)d2 
         ON d2.home_id = amm.uid_local 
ORDER  BY uid_local 

производит:

+------+---------------+-------------------+-------+------------------------------------------+--------------------+----------+-------------+-------+---------------------------------+
| id   | select_type   |      table        | type  |              possible_keys               |        key         | key_len  |    ref      | rows  |              Extra              |
+------+---------------+-------------------+-------+------------------------------------------+--------------------+----------+-------------+-------+---------------------------------+
| 1    | PRIMARY       | <derived7>        | ALL   | NULL                                     | NULL               | NULL     | NULL        | 2     | Using temporary; Using filesort |
| 1    | PRIMARY       | amm               | ref   | uid_local,uid_foreign,uid_local_foreign  | uid_local_foreign  | 4        | d2.home_id  | 1     | Using where; Using index        |
| 1    | PRIMARY       | <derived2>        | ALL   | NULL                                     | NULL               | NULL     | NULL        | 5     | Using where; Using join buffer  |
| 7    | DERIVED       | NULL              | NULL  | NULL                                     | NULL               | NULL     | NULL        | NULL  | No tables used                  |
| 8    | UNION         | NULL              | NULL  | NULL                                     | NULL               | NULL     | NULL        | NULL  | No tables used                  |
| NULL | UNION RESULT  | <union7,8>        | ALL   | NULL                                     | NULL               | NULL     | NULL        | NULL  |                                 |
| 2    | DERIVED       | NULL              | NULL  | NULL                                     | NULL               | NULL     | NULL        | NULL  | No tables used                  |
| 3    | UNION         | NULL              | NULL  | NULL                                     | NULL               | NULL     | NULL        | NULL  | No tables used                  |
| 4    | UNION         | NULL              | NULL  | NULL                                     | NULL               | NULL     | NULL        | NULL  | No tables used                  |
| 5    | UNION         | NULL              | NULL  | NULL                                     | NULL               | NULL     | NULL        | NULL  | No tables used                  |
| 6    | UNION         | NULL              | NULL  | NULL                                     | NULL               | NULL     | NULL        | NULL  | No tables used                  |
| NULL | UNION RESULT  | <union2,3,4,5,6>  | ALL   | NULL                                     | NULL               | NULL     | NULL        | NULL  |                                 |
+------+---------------+-------------------+-------+------------------------------------------+--------------------+----------+-------------+-------+---------------------------------+

Как вы видите, использует где, использует сортировку файлов, хотя это должно разрешаться из составного индекса.

Ответы [ 2 ]

2 голосов
/ 03 января 2012

Если количество строк не очень велико, оптимизатор запросов использует сканирование таблиц вместо индексов.

2 голосов
/ 03 января 2012

Если tx_hep_homes_attributes_mm - это только 9 строк, показанных здесь, тогда я ожидаю, что индекс будет игнорироваться, так как все данные будут в кеше, а использование индекса будет стоить дороже.

Индексы используются главным образом, когда объем данных, выбранных индексом, намного меньше количества строк в таблице. Здесь 75% строк находятся в результате.

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