查询/准备警告中没有使用索引 - 但列已编制索引

时间:2016-11-19 14:04:20

标签: mysql mysqli

我有一个带主键的Mysql表:

CREATE TABLE `members` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `type` char(1) ,
  `status` char(1) ,
  `enable` char(1),
  `club` int(10) unsigned NOT NULL,
   PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=3714 DEFAULT CHARSET=utf8 ;

如果我执行以下查询

SELECT * FROM members WHERE club='adfsd';

我在查询/准备好的陈述中使用了“没有索引”#39;来自Mysqli的警告。这是公平的 - 我真的应该有一个索引。然后我在俱乐部上添加一个索引

KEY `club` (`club`)

索引是 - 我可以通过DESCRIBE看到它,但是当我执行SELECT查询时,我得到相同的'没有使用索引...'警告。

所以我将indexname更改为与列名

不同的名称
KEY `clubind` (`club`)

并且查询无效警告。

如果我在其他列之一上建立索引,请说“状态”#39;并使用' status'作为索引名称,并使用查询中的列,一切都按预期工作。

我能看到的唯一不同的是,有问题的列是整数,其他是字符。

1 个答案:

答案 0 :(得分:0)

您已将club声明为整数。

您的查询是:

SELECT * FROM members WHERE club = 'adfsd';

混合数据类型通常会阻止使用索引。

此外,查询中是否使用索引取决于表的大小。即使对于适当的查询,索引的存在并不总是意味着它将被使用。