oracle组合索引最左原则,复合索引&最左原则 -- 实战

建表语句:

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

;

批量插入数据:

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: **

oracle组合索引最左原则,复合索引&最左原则 -- 实战_第1张图片

Explain SQL:

1)explain select bu_id,name,age,sex from t_user where bu_id=17

结果:idselect_type tabletypepossible_keyskeykey_len refrows

1SIMPLE t_userrefindex_buid_name_ageindex_buid_name_age4 const10853

结论:使用了index_buid_name_age索引,并且只使用了复合索引中的bu_id列。

2)explain select bu_id,name,age,sex from t_user where name='jack'

结果:idselect_type tabletypepossible_keyskey key_len refrowsExtra

1SIMPLE t_userALL21706Using where

结论:没有使用索引,进行了全表扫描。

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

结果:idselect_type tabletypepossible_keyskey key_len refrowsExtra

1SIMPLE t_userrefindex_buid_name_ageindex_buid_name_age771 const,const1Using 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

结果:idselect_type tabletypepossible_keyskey key_len refrowsExtra

1SIMPLE t_userrefindex_buid_name_ageindex_buid_name_age775 const,const,const1Using 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'

结果:idselect_type tabletypepossible_keyskey key_len refrowsExtra

1SIMPLE t_userrefindex_buid_name_ageindex_buid_name_age4 const10853Using 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%'

结果:idselect_type tabletypepossible_keyskey key_len refrowsExtra

1SIMPLE t_userrangeindex_buid_name_ageindex_buid_name_age7711Using 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

结果:idselect_type tabletypepossible_keyskey key_len refrowsExtra

1SIMPLE t_userrefindex_buid_name_ageindex_buid_name_age4 const10852Using 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'

结果:idselect_type tabletypepossible_keyskey key_len refrowsExtra

1SIMPLE t_userindexindex_buid_name_age77521705Using where; Using index

结论:使用了index_buid_name_age索引,并且(根据key_len可以推断出)使用了该复合索引中的bu_id列、name列和age列。

注意:比较一下第2个sql语句和第8个sql语句,二者的区别在于:

1>第2个sql语句查询了非索引列sex,故根据最左原则,无法使用该索引;

2>第8个sql语句只查询了索引列,(若只查询索引列,则只需扫描索引树即可)故可以使用该索引。

你可能感兴趣的:(oracle组合索引最左原则)