【发布时间】:2014-09-15 12:08:53
【问题描述】:
谁能告诉我为什么mysql没有使用'playerLead_status_INDEX'索引?
CREATE TABLE `bcs_player_lead`(
`id` int(11) NOT NULL AUTO_INCREMENT,
`first_name` varchar(100) DEFAULT NULL,
`last_name` varchar(100) DEFAULT NULL,
`email_id` varchar(100) DEFAULT NULL,
`city` varchar(100) DEFAULT NULL,
`state` varchar(100) DEFAULT NULL,
`country` varchar(100) DEFAULT NULL,
`created` datetime DEFAULT NULL,
`status` int(11) DEFAULT NULL COMMENT '1-New,2-invitation send',
PRIMARY KEY (`id`),
KEY `playerLead_status_INDEX` (`status`)
) ENGINE=InnoDB AUTO_INCREMENT=510 DEFAULT CHARSET=latin1;
解释选择 email_id,id,NULL,first_name,last_name,NULL,state,city,NULL,(2) 作为类型 FROM bcs_player_lead WHERE status='1'
id|select_type|table |type|possible_keys |key |key_len |ref |rows |Extra
1 |简单 |bcs_player_lead |全部 |playerLead_status_INDEX|{null}|{null}|{null}|第458章
bcs_player_lead 有两个键 -
- ID 上的 PRIMARY
- playerLead_status_INDEX 状态
提前致谢!
【问题讨论】:
-
不确定您使用的 MySQL 版本,但考虑到您的状态为 'DEFAULT NULL' 可能是个问题。我在 MySQL 站点 dev.mysql.com/doc/refman/5.5/en/create-table.html 上找到了这个@“在 MySQL 5.5 中,只有 InnoDB、MyISAM 和 MEMORY 存储引擎支持对可以具有 NULL 值的列的索引。在其他情况下,您必须将索引列声明为 NOT NULL 或错误结果.".我唯一能想到的。
-
"...有时 MySQL 不使用索引,即使索引可用。这种情况发生的一种情况是优化器估计使用索引将需要 MySQL 访问一个非常大的百分比表中的行数。(在这种情况下,表扫描可能会快得多,因为它需要的搜索次数更少。)...”参见dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html
-
这可能是@Leo 所说的情况,并且情况是表统计信息未更新。
-
只是检查,尝试将 LIMIT 添加到您的查询(可能是 LIMIT 1000)=> "...但是,如果这样的查询使用 LIMIT 仅检索某些行,MySQL 无论如何都会使用索引,因为它可以更快地找到要在结果中返回的几行。..."
-
Abhi,使用
force index只是一个检查。在您的情况下,因为它只获取 500 行,即使它不进行索引搜索,您也不会感到任何渣滓。