表结构与数据
id为主键,id为奇数sex=1,id为偶数sex=0 sex=0,50000条数据;sex=1,50000条数据
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;
添加的索引类型
测试结果:
SELECT * FROM people WHERE sex = 0;
SELECT * FROM people WHERE sex = 1;
| 无sex索引 | 有sex索引 | |
|---|---|---|
| sex=0 | ||
| sex=1 |
添加索引后的EXPLAIN:
原因
在InnoDB中每一个表都会有聚集索引,如果表定义了主键,则主键就是聚集索引。一个表只有一个聚集索引,其余为普通索引。 索引的结构是B+树,非叶子节点存储key,叶子节点存储value。
- 聚集索引,叶子节点存储行记录,InnoDB索引和记录是存储在一起的。
- 普通索引,叶子节点存储了主键的值。
以上表的索引结构示例如下(PS:索引结构仅供参考) 聚集索引
参考:
mp.weixin.qq.com/s/tmkRAmc1M…
blog.jcole.us/innodb/
blog.csdn.net/u012978884/…
draveness.me/mysql-innod…