[InnoDB]性别字段为什么不适合加索引

栏目: 数据库 · 发布时间: 6年前

内容简介:id为主键,id为奇数sex=1,id为偶数sex=0 sex=0,50000条数据;sex=1,50000条数据添加的索引类型可以看到相同的sql,加索引之后比不加索引慢许多。

id为主键,id为奇数sex=1,id为偶数sex=0 sex=0,50000条数据;sex=1,50000条数据

[InnoDB]性别字段为什么不适合加索引
[InnoDB]性别字段为什么不适合加索引
CREATE TABLE `people` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `sex` tinyint(1) unsigned DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=100001 DEFAULT CHARSET=utf8;
复制代码
CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_initData`()
BEGIN
    DECLARE i INT DEFAULT 1;
    WHILE i<=100000 DO
        INSERT INTO people(name, sex) VALUES(CONCAT('姓名',i),0);
        SET i = i+1;
    END WHILE;
END

CALL proc_initData();
UPDATE people SET sex = 1 WHERE MOD(id,2) = 1;
复制代码

添加的索引类型

[InnoDB]性别字段为什么不适合加索引

测试结果:

SELECT * FROM people WHERE sex = 0;
SELECT * FROM people WHERE sex = 1;
复制代码
无sex索引 有sex索引
sex=0
[InnoDB]性别字段为什么不适合加索引
[InnoDB]性别字段为什么不适合加索引
sex=1
[InnoDB]性别字段为什么不适合加索引
[InnoDB]性别字段为什么不适合加索引

可以看到相同的sql,加索引之后比不加索引慢许多。

原因

在InnoDB中每一个表都会有聚集索引,如果表定义了主键,则主键就是聚集索引。一个表只有一个聚集索引,其余为普通索引。 索引的结构是B+树,非叶子节点存储key,叶子节点存储value。

  1. 聚集索引,叶子节点存储行记录,InnoDB索引和记录是存储在一起的。
  2. 普通索引,叶子节点存储了主键的值。

以上表的索引结构示例如下(PS:索引结构仅供参考) 聚集索引

[InnoDB]性别字段为什么不适合加索引

sex列普通索引

[InnoDB]性别字段为什么不适合加索引
在使用普通索引查询时,会先加载普通索引,通过普通索引查询到实际行的主键。再使用主键通过聚集索引查询相应的行。以此循环查询所有的行。 若直接全量搜索聚集索引,则不需要在普通索引和聚集索引中来回切换。 相比两种操作的总开销可能扫描全表效率更高。

以上所述就是小编给大家介绍的《[InnoDB]性别字段为什么不适合加索引》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

创新者

创新者

[美] 沃尔特·艾萨克森 / 关嘉伟、牛小婧 / 中信出版社 / 2017-4 / 88.00元

《创新者》是沃尔特·艾萨克森继全球畅销书《史蒂夫·乔布斯传》之后的又一部力作,不仅讲述了计算机和互联网从无到有的发展历程,为我们 生动地刻画出数字时代的创新者群像,还深度挖掘互联网的精神内核,解读了“诗意科学”这个重大主题。 在近200年的数字化进程中群星闪耀,艾萨克森从第一个计算机程序的创造者、浪漫主义诗人拜伦之女埃达•洛夫莱斯伯爵夫人说起,细数了这一群将科学与人文融合的创新者,他们包括第......一起来看看 《创新者》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具