建表語句: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語句只查詢了索引列,(若只查詢索引列,則只需掃描索引樹便可)故可使用該索引。