本文共 2265 字,大约阅读时间需要 7 分钟。
索引就相当于一本书的目录,通过目录可以快速的找到对应的资源。
在数据库方面,查询一张表的时候有两种检索方式:索引为什么可以提高检索效率呢?
其实最根本的原理是缩小了扫描的范围。索引虽然可以提高检索效率,但是不能随意的添加索引,因为索引也是数据库当中的对象,也需要数据库不断的维护。是有维护成本的。比如,表中的数据经常被修改这样就不适合添加索引,因为数据一旦修改,索引需要重新排序,进行维护。
添加索引是给某一个字段,或者说某些字段添加索引。
select ename,sal from emp where ename = 'SMITH';
创建索引对象:
create index 索引名称 on 表名(字段名); alter table 表名 add unique index 索引名 (字段名); 删除索引对象: drop index 索引名称 on 表名; alter table 表名 drop index 字段; 查看索引: show index from 表名;注意一定不可以用select * … 可以看到type!=all了,说明使用了索引
mysql> explain select ename,sal from emp where sal = 5000;
±—±------------±------±-----±--------------±-----±--------±-----±-----±------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | ±—±------------±------±-----±--------------±-----±--------±-----±-----±------------+ | 1 | SIMPLE | emp | ALL | NULL | NULL | NULL | NULL | 14 | Using where | ±—±------------±------±-----±--------------±-----±--------±-----±-----±------------+ 给薪资sal字段添加索引:create index emp_sal_index on emp(sal);mysql> explain select ename,sal from emp where sal = 5000;
±—±------------±------±-----±--------------±--------------±--------±------±-----±------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | ±—±------------±------±-----±--------------±--------------±--------±------±-----±------------+ | 1 | SIMPLE | emp | ref | emp_sal_index | emp_sal_index | 9 | const | 1 | Using where | ±—±------------±------±-----±--------------±--------------±--------±------±-----±------------+索引的实现原理?
通过B Tree缩小扫描范围,底层索引进行了排序,分区,索引会携带数据在表中的“物理地址”, 最终通过索引检索到数据之后,获取到关联的物理地址,通过物理地址定位表中的数据,效率是最高的。select ename from emp where ename = 'SMITH';
通过索引转换为:
select ename from emp where 物理地址 = 0x3;
单一索引: 给单个字段添加索引
复合索引: 给多个字段联合起来添加1个索引 主键索引:主键上会自动添加索引 唯一索引:有unique约束的字段上会自动添加索引 …select ename from emp where ename like '%A%';
模糊查询的时候,第一个通配符使用的是%,这个时候索引是失效的。
转载地址:http://pxuki.baihongyu.com/