为什么仅使用索引不能解决此结果?

时间:2012-01-03 13:51:32

标签: mysql sql optimization indexing

架构:

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 个答案:

答案 0 :(得分:2)

如果tx_hep_homes_attributes_mm只是这里显示的9行,那么我希望忽略索引,因为所有数据都将在缓存中,使用索引会花费更多。

当索引选择的数据量远小于表中的行数时,主要使用指标。这里75%的行都在结果中。

答案 1 :(得分:2)

如果行数不是很大,查询优化器使用表扫描而不是索引。