建表语句: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:索引
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语句只查询了索引列,(若只查询索引列,则只需扫描索引树便可)故可使用该索引。