对于表:
create table heyf_2 (id serial, ver int(10)
name char(5)) ;
engine=innodb;
而在heyf_2上对id和ver上加复合索引。
需要对表中插入百万数据(用mysql的存储过程)
对于两条语句查询:
1)select id from heyf_2 order by id 很慢
2)select id from heyf order by id,vef 很快
为什么上面语句会差距在数量级上呢,我们要从innodb的索引原理上分析
innodb是btree树那样,每个数据都是存放在页上,可以类比是每一个单独的块。对于第一条语句,是根据id排序,分配在每个页上,但是它本身块上数据很大,而查到位置要不断打开页,再关闭,这是资源额。对于第二条语句,用到了索引覆盖,id只需要在id和ver复合索引里找到。
如果是myisam就差不多了,因为myisam是一行一行的,顺序的,差别不会那么大
delimiter $$ SET AUTOCOMMIT = 0$$ create procedure test1() begin declare v_cnt decimal (10) default 0 ; dd:loop insert into heyf_2 values (null,‘aaaaa‘),(null,‘aaaaa‘),(null,‘aaaaa‘),(null,‘aaaaa‘),(null,‘aaaaa‘), (null,‘aaaaa‘),(null,‘aaaaa‘),(null,‘aaaaa‘),(null,‘aaaaa‘),(null,‘aaaaa‘); commit; set v_cnt = v_cnt+10 ; if v_cnt = 10000 then leave dd; end if; end loop dd ; end;$$fenxi
本文出自 “Linux运维” 博客,请务必保留此出处http://2853725.blog.51cto.com/2843725/1386572
原文:http://2853725.blog.51cto.com/2843725/1386572