複合索引&最左原則 -- 實戰

建表語句:sql

CREATE TABLE `t_user` (
	`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
	`bu_id` INT(20) NOT NULL,
	`name` VARCHAR(255) NOT NULL,
	`age` INT(11) NOT NULL,
	`sex` VARCHAR(255) NULL DEFAULT NULL,
	PRIMARY KEY (`id`),
	INDEX `index_uid_name_age` (`bu_id`, `name`, `age`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=22014
;

批量插入數據:ui

CREATE PROCEDURE batch_insert() 
BEGIN 
	DECLARE a INT DEFAULT 1; 

	WHILE (a <= 10000) DO 
	SET a = a + 1; 
	insert into t_user set name='name2', age=a, bu_id=a+5;
	END WHILE;

	COMMIT;
END;
CALL batch_insert();

**Explain SQL: **code

Explain SQL- 圖示

Explain SQL:索引

1)explain select bu_id,name,age,sex from t_user where bu_id=17
  
	  結果:id	select_type	 table	type	possible_keys			key						key_len	 ref	rows 
			1	SIMPLE		 t_user	ref		index_buid_name_age		index_buid_name_age		4		 const	10853	
	  結論:使用了index_buid_name_age索引,而且只使用了複合索引中的bu_id列。
		
2)explain select bu_id,name,age,sex from t_user where name='jack'
	
	  結果:id	select_type	 table	type	possible_keys			key 					key_len  ref	rows	Extra 
			1	SIMPLE		 t_user	ALL																		21706	Using where
	  結論:沒有使用索引,進行了全表掃描。
	
3)explain select bu_id,name,age,sex from t_user where bu_id=17 and name='jack'
	
	  結果:id	select_type	 table	type	possible_keys			key 					key_len  ref			rows	Extra 
			1	SIMPLE		 t_user	ref		index_buid_name_age		index_buid_name_age		771		 const,const	1		Using index condition
			
	  結論:使用了index_buid_name_age索引,而且(根據key_len能夠推斷出)使用了該複合索引中的bu_id列和name列。
	
4)explain select bu_id,name,age,sex from t_user where bu_id=17 and name='jack' and age=18

	  結果:id	select_type	 table	type	possible_keys			key 					key_len  ref				rows	Extra 
			1	SIMPLE		 t_user	ref		index_buid_name_age		index_buid_name_age		775		 const,const,const	1		Using index condition
			
	  結論:使用了index_buid_name_age索引,而且(根據key_len能夠推斷出)使用了該複合索引中的bu_id列、name列和age列。

5)explain select bu_id,name,age,sex from t_user where bu_id=17 and name like '%jack'

	  結果:id	select_type	 table	type	possible_keys			key 					key_len  ref			rows	Extra 
			1	SIMPLE		 t_user	ref		index_buid_name_age		index_buid_name_age		4		 const			10853	Using index condition
	  結論:使用了index_buid_name_age索引,可是隻使用了該複合索引中的bu_id列。
  
6)explain select bu_id,name,age,sex from t_user where bu_id=17 and name like 'jack%'
 
	  結果:id	select_type	 table	type	possible_keys			key 					key_len  ref			rows	Extra 
			1	SIMPLE		 t_user	range	index_buid_name_age		index_buid_name_age		771						1		Using index condition
	  結論:使用了index_buid_name_age索引,而且(根據key_len能夠推斷出)使用了該複合索引中的bu_id列和name列。
  
7)explain select bu_id,name,age,sex from t_user where bu_id=17 and age=18
  
	  結果:id	select_type	 table	type	possible_keys			key 					key_len  ref			rows	Extra 
			1	SIMPLE		 t_user	ref		index_buid_name_age		index_buid_name_age		4		 const			10852	Using index condition
	  結論:使用了index_buid_name_age索引,可是隻使用了該複合索引中的bu_id列。
  
8)explain select name from t_user where name='jack' 	或	explain select bu_id,name,age from t_user where name='jack'
  
	  結果:id	select_type	 table	type	possible_keys			key 					key_len  ref			rows	Extra 
			1	SIMPLE		 t_user	index							index_buid_name_age		775						21705	Using where; Using index
	  結論:使用了index_buid_name_age索引,而且(根據key_len能夠推斷出)使用了該複合索引中的bu_id列、name列和age列。
	  注意:比較一下第2個sql語句和第8個sql語句,兩者的區別在於:
			1>第2個sql語句查詢了非索引列sex,故根據最左原則,沒法使用該索引;
			2>第8個sql語句只查詢了索引列,(若只查詢索引列,則只需掃描索引樹便可)故可使用該索引。
相關文章
相關標籤/搜索