索引学习
提高数据库性能,索引是最物美价廉的东西了。不用加内存,不用改程序,不用调SQL,查询速度就可以提高百倍千倍。
假设emp表有八百万条数据
select count(*) from emp;
-- 索引学习 create table emp( id int , `name` VARCHAR(30), sex varchar(10) ) select * from emp; select count(*) from emp; INSERT INTO emp(id,name,sex) ( SELECT * FROM emp ); -- 查询数据的存放路径。 show global variables like 'datadir%' 在没有加索引的情况下来查询数据 耗时差不多2s emp.idb 差不多一百多兆。 select * from emp where name = '毅哥'; 创建索引,在搜索 现在差不多一百四十多兆,增大了不少。(空间换时间),现在0.00几秒,速度程几何加快提升。 create index emp_index on emp(id); select * from emp where name = '毅哥'; 索引的原理。 在没有加索引的时候,查询是从第一条到最后一条数据全部查询,进行全表扫描。所以数据量大,速度就特别慢。 在加了索引之后,他会根据你加索引的列,生成二叉树。取中间值,然后依次小的在左边,大的在右边进行排序,哪怕数据量大,速度也很快。 索引的代价: 1.磁盘占用 2.对该列的增加,修改,删除的语句效率有影响(因为执行这些语句,会重新生成索引二叉树) 但是在升级中查询就站到了百分之九十以上。 创建索引 索引的类型 1.主键索引,主键自动的为主索引(primary key) 2.唯一索引(unique) 3.普通索引(indext) 4.全文索引(不用学) -- 在设计表的时候,设计主键,自动就是索引了,搜索很快的。 -- 在设计表到时候,某个字段添加unique唯一约束,那么他自己就有唯一索引了,搜索也是很快的。 我们往往用的最多的是普通索引,index 因为我们平常用名字或者其他条件查询的时候,就可以用这个普通索引。 create table test8( id int, `name` varchar(30) ) -- 查询表是否有索引 show indexes from test8; -- 创建唯一索引 create unique index test8_index on test8(id); 索引名,索引表及索引列。 -- 创建普通索引 create index test_index on test8(name); 一个列上面只可以有一个索引。 -- 如何选择 1.如果该列不会重复,那就是添加唯一索引,否则就是普通索引。 -- 删除索引 先查需要删除的索引名,在删 show index from test8; drop index test_index on test8; 索引名,索引表。 -- 修改索引,先删除,在添加。 -- 查询索引 1.方式 show indexes from test8; 2.方式 show index from test8; 3.方式 show keys from test8; 总结: 那些列上面适合做索引? 1.较频繁的作为查询条件字段的应该创建索引。如部门编号等 2.唯一性太差的字段不适合单独创建索引,即使频繁查询也不行。如性别的男女等 3.更新非常频繁的字段不适合创建索引。如登录次数等(会重新构建索引)等 4.不会出现在where子句中的字段不该创建索引。 需要遵守,否则可能添加了索引,但是速度反而更慢了。