[InnoDB]性別字段爲何不適合加索引

表結構與數據

id爲主鍵,id爲奇數sex=1,id爲偶數sex=0 sex=0,50000條數據;sex=1,50000條數據 mysql

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;
複製代碼

添加的索引類型 sql

測試結果:

SELECT * FROM people WHERE sex = 0;
SELECT * FROM people WHERE sex = 1;
複製代碼
無sex索引 有sex索引
sex=0
在這裏插入圖片描述
在這裏插入圖片描述
sex=1
在這裏插入圖片描述
在這裏插入圖片描述

添加索引後的EXPLAIN: 測試

能夠看到相同的sql,加索引以後比不加索引慢許多。

緣由

在InnoDB中每個表都會有彙集索引,若是表定義了主鍵,則主鍵就是彙集索引。一個表只有一個彙集索引,其他爲普通索引。 索引的結構是B+樹,非葉子節點存儲key,葉子節點存儲value。ui

  1. 彙集索引,葉子節點存儲行記錄,InnoDB索引和記錄是存儲在一塊兒的。
  2. 普通索引,葉子節點存儲了主鍵的值。

以上表的索引結構示例以下(PS:索引結構僅供參考) 彙集索引spa

sex列普通索引

在使用普通索引查詢時,會先加載普通索引,經過普通索引查詢到實際行的主鍵。再使用主鍵經過彙集索引查詢相應的行。以此循環查詢全部的行。 若直接全量搜索彙集索引,則不須要在普通索引和彙集索引中來回切換。 相比兩種操做的總開銷可能掃描全表效率更高。

參考:
mp.weixin.qq.com/s/tmkRAmc1M…
blog.jcole.us/innodb/
blog.csdn.net/u012978884/…
draveness.me/mysql-innod….net

相關文章
相關標籤/搜索