【问题标题】:MySQL key index not working, search all rows using whereMySQL键索引不起作用,使用where搜索所有行
【发布时间】:2018-09-04 05:31:13
【问题描述】:

所以基本上我创建了一个表:

CREATE TABLE IF NOT EXISTS `student` (
    `id` int(4) unsigned NOT NULL AUTO_INCREMENT,
    `campus` enum('CAMPUS1', 'CAMPUS2') NOT NULL,
    `fullname` char(32) NOT NULL,
    `gender` enum('MALE', 'FEMALE') NOT NULL,
    `birthday` char(16) NOT NULL,
    `phone` char(32) NOT NULL,
    `emergency` char(32) NOT NULL,
    `address` char(128) NOT NULL,

    PRIMARY KEY (`idx`),
    KEY `key_student` (`campus`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

我有 20 行,CAMPUS1 中只有 12 行

但是当我使用查询它时:SELECT * FROM student WHERE campus='CAMPUS1'; EXPLAIN 是这样的:

id  select_type   table   type  possible_keys  key  key_len  ref  rows  Extra
1   SIMPLE        student ALL   key_student    NULL NULL     NULL 20    Using where

我是这个东西的新手,KEY 真的有效吗?我阅读了文档,但我不能理解那么多。

【问题讨论】:

  • 在这么小的表上,优化器可能认为扫描整个表比通过索引访问数据更便宜。

标签: mysql key


【解决方案1】:

在决定使用哪个索引进行查询时,MySQL 正试图变得聪明(取得了不同程度的成功)。

在某些情况下,查询整个表而不是使用索引会更快。例如:如果您的表有 500 条记录 CAMPUS1 和 100 条记录 CAMPUS2,则在查找 campus='CAMPUS1' 时执行完整(600 条记录)扫描会更快。

当您只有 20 行时,您会遇到算法的边缘情况。尝试添加更多行,看看会发生什么。

此外,该索引的 cardinality 似乎非常低(仅在 2 个值之间平均分配)。它可能不会很有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-15
    • 2013-07-20
    • 2015-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多