Mysql索引未正确使用

时间:2010-12-20 12:32:17

标签: mysql indexing

我遇到了一个简单的MySQL索引的奇怪问题。

我得到了下表:

CREATE TABLE `import` (
  `import_id` int(11) NOT NULL AUTO_INCREMENT,
  `import_title` text,
  `import_url` text,
  `import_description` text,
  `import_completed` enum('y','n') NOT NULL DEFAULT 'n',
  `import_user` int(11) DEFAULT NULL,
  `import_added` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`import_id`),
  KEY `import_added` (`import_added`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

在那个表中有几千行,我希望得到以下选择条款的前100个:

SELECT 
  import_id, 
  import_title, 
  import_url, 
  import_description, 
  import_user, 
  import_added 
FROM import 
WHERE import_completed = 'n' 
ORDER by import_added ASC 
LIMIT 0,100

当我使用DESCRIBE仔细查看查询时,我的本地计算机使用“添加”索引并在几毫秒内返回100行,如预期的那样。

当我在“生产”服务器上使用具有相同结构和内容的相同数据库并在那里使用DESCRIBE时,它表明也使用了索引,但它返回该表中的所有行,查询大约需要6个秒。

我错过了什么?为什么索引无法正常工作?

2 个答案:

答案 0 :(得分:2)

错误使用索引

...
KEY `import_added` (import_completed, import_added) ...

执行查询执行计划

desc extended SELECT 
  import_id, 
  import_title, 
  import_url, 
  import_description, 
  import_user, 
  import_added 
FROM import 
WHERE import_completed = 'n' 
ORDER by import_added ASC 
LIMIT 0,100;

答案 1 :(得分:0)

尝试在(import_completed, import_added)上创建索引where部分将使用import_completed,对于order by它将使用import_added。 (我希望这适用于MyIsam - On Innodb这是行为)