Mysql索引不起作用

时间:2014-07-24 04:34:39

标签: mysql indexing

任何人都可以告诉我为什么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;
  

EXPLAIN SELECT email_id,id,NULL,first_name,last_name,NULL,state,city,NULL,(2)as type   FROM bcs_player_lead WHERE status =' 1'

     

id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra
    1 | SIMPLE | bcs_player_lead | ALL | playerLead_status_INDEX | {null} | {null} | {null} | 458 |使用何处

bcs_player_lead有两个键 -

  1. ID
  2. 上的主要内容
  3. playerLead_status_INDEX状态
  4. 提前致谢!

2 个答案:

答案 0 :(得分:1)

我不是DBA而是AFAIK,有时索引不会被使用,即使有一个:当表统计信息没有更新(OR)时可能要检索的行数少于@Leo所说的(因为在你的情况下只有458行到检索)。

您可以使用FORCE INDEX (index_name)在查询中强制使用索引。尝试一次,然后查看EXPLAIN PLAN

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'

您可能希望在MySQL not using indexes with WHERE IN clause?

后查看此信息

答案 1 :(得分:0)

查询规划器计算执行给定查询的多个路径的成本。选择成本最低的路径。使用索引扫描 VS 表扫描有 2 条路径。 让我们考虑两条路径:

  1. 由于您有一个关于状态的索引并且还尝试检索其他列,因此您的索引不是覆盖索引。因此,当一个键满足 where 子句时,innodb 需要从磁盘读取该行的数据(因为索引本身没有它)。 'status' 字段似乎只有 2 个值。对于这两个值中的任何一个,很多行都符合条件。例如:如果识别出 1k 行,这意味着从磁盘中随机读取 1k 次
  2. 假设您的表有 10k 行。如果使用表扫描,则意味着扫描和读取表的所有页面。但这些将主要是顺序读取。

因此,案例 1 可能比案例 2 产生更多的成本。您应该检查索引基数以了解这一点。通常,基数非常低和选择性非常低的索引是不好的选择,即唯一值非常低(状态)并且实际行数非常高。