Mysql索引不工作

Mysql索引不工作,mysql,indexing,Mysql,Indexing,有人能告诉我为什么mysql不使用“playerLead\u status\u 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, `ci

有人能告诉我为什么mysql不使用“playerLead\u status\u 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;
解释选择电子邮件id、id、NULL、名字、姓氏、NULL、州、城市、NULL、2作为类型 来自bcs_玩家_领导,状态为1'

id |选择|类型|类型|可能的|键|键|列|参考|行|额外 1 |简单| bcs |玩家|领先|所有|玩家领先|状态|索引|{null}|{null}| 458 |使用where

bcs_玩家_领导有两把钥匙-

主要基于ID playerLead\u status\u状态索引
提前谢谢

我不是DBA,但我知道,有时即使有索引,也不使用索引:当表统计信息没有更新时,或者像@Leo所说的,要检索的行数可能更少,因为在您的情况下,只有458行要检索

您可以在查询中使用forceindex index\u name强制使用索引。试一下,检查一下解释计划


您可能希望查看这篇文章一次,Query planner会计算执行给定查询的多条路径的成本。选择成本最低的路径。使用索引扫描和表扫描有两条路径。 让我们考虑两个路径:

由于您在状态上有一个索引,并且正在尝试检索其他列,所以您的索引不是覆盖索引。因此,当一个键满足where子句时,innodb需要从磁盘读取该行的数据,因为索引本身没有该行的数据。 “状态”字段似乎只有2个值。对于这两个值中的任何一个,许多行都符合条件。例如:如果标识了1k行,这意味着从磁盘随机读取1k行 假设您的表有10k行。如果使用表扫描,则意味着扫描并读取表的所有页面。但这些将主要是顺序读取。
因此,案例1可能比案例2产生更多的成本。您应该检查索引基数以了解这一点。通常,基数非常低、选择性非常低的索引是错误的选择,即唯一值是非常低的状态,而实际行数是非常高的。

不确定您使用的MySQL版本,但考虑到您的状态为“DEFAULT NULL”,这可能是一个问题。我在MySQL 5.5中的MySQL站点上发现了这一点,只有InnoDB、MyISAM和内存存储引擎支持可以有空值的列上的索引。在其他情况下,必须将索引列声明为非NULL或错误结果。我能想到的唯一一件事是……有时候MySQL不使用索引,即使有可用的索引。出现这种情况的一种情况是,优化器估计使用索引需要MySQL访问表中很大比例的行。在这种情况下,表扫描可能要快得多,因为它需要更少的搜索。。。正如@Leo所说,情况可能是这样的,情况是表统计数据没有更新。只要检查一下,尝试向查询添加LIMIT可能是LIMIT 1000=>…但是,如果这样的查询使用LIMIT只检索一些行,MySQL还是会使用索引,因为它可以更快地找到结果中要返回的几行。。。阿比,使用武力指数只是一种检查。在您的情况下,因为它只获取500行,即使它不进行索引查找,您也不会感觉到任何熔渣。是的,我认为它不考虑索引,因为记录较少。谢谢
SELECT email_id,id,NULL,first_name,last_name,NULL,state,city,NULL,(2) as type 
FROM bcs_player_lead 
FORCE INDEX (playerLead_status_INDEX)
WHERE status='1'