Mysql 聯合索引最左匹配原則

一、環境準備

1、建表

DROP TABLE IF EXISTS `test_table`;
CREATE TABLE `test_table` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '編號',
  `namee` varchar(255) DEFAULT NULL COMMENT '姓名',
  `sex` varchar(255) DEFAULT NULL COMMENT '性別',
  `age` int(11) DEFAULT NULL COMMENT '年齡',
  `bitthday` varchar(255) DEFAULT NULL COMMENT '生日',
  `aihao` varchar(255) DEFAULT NULL COMMENT '愛好',
  `xuehao` varchar(255) DEFAULT NULL COMMENT '學號',
  `mingci` int(11) DEFAULT NULL COMMENT '名詞',
  PRIMARY KEY (`id`),
  KEY `lianhe` (`namee`,`xuehao`,`mingci`)
) ENGINE=InnoDB AUTO_INCREMENT=5002 DEFAULT CHARSET=utf8;

2、使用存儲過程插入一些測試數據

DROP PROCEDURE test_insert;
DELIMITER ;;


CREATE PROCEDURE test_insert ()
BEGIN
	DECLARE
		i INT DEFAULT 0 ;
	WHILE i < 5000 DO
		INSERT INTO test_table (
			namee,
			sex,
			age,
			bitthday,
			aihao,
			xuehao,
			mingci
		)
	VALUES
		(
			CONCAT('test', i),
			'男',
			22,
			'2019-01-01',
			'xuexi',
			CONCAT('test', i),
			i
		) ;
	SET i = i + 1 ;
	END
	WHILE ;
	END;;

CALL test_insert () ;

二、測試現象

1、按照聯合索引順序查詢查看索引使用情況

在這裏插入圖片描述
圖中可以看到,聯合索引lianhe的字段順序是 namee,xuehao,mingci,現使用這個順查看索引使用情況如下:

EXPLAIN select * from test_table where namee = "aa" and xuehao = "xuexi"  and mingci = "aaa";

在這裏插入圖片描述
通過觀察,發現用到了索引 lianhe。

2、跳過聯合索引的最左邊字段測試索引使用情況

跳過最左邊字段也就是不適用第一個字段namee時測試結果如下:

EXPLAIN select * from test_table where  xuehao = "xuexi"  and mingci = "aaa";

在這裏插入圖片描述
圖中可以發現,type = all 並沒有使用索引。
這裏就是聯合索引的最左匹配原則。

mysql 索引最左匹配原則參考

發佈了37 篇原創文章 · 獲贊 45 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章