索引和视图
什么是索引?有什么用?
索引就相当于一本书的目录,通过目录可以快速的找到对应的资源.
在数据库方面,查询一张表的时候有两种查询方式:
第一种方式:全表扫描.
第二种方式:根据索引检索(效率远高于遍历查询)

索引为什么可以提高检索效率呢?
		其实最根本的原理是缩小了扫描的范围.

	索引虽然可以提高检索效率,但是不能随意的添加索引,因为索引也是数据库当中的对象,也需要数据库对其不断的维护,是有维护成本的.
	比如,表中的数据经常被修改,这样就很不适合添加索引,因为数据一旦修改,索引就要重新排序,进行维护.

	添加索引是给某一个字段或者说某些字段添加索引.

	select ename, sal from emp where ename = 'smith';
	当ename字段上没有添加索引的时候,以上sql语句会进行全表扫描,扫描ename字段中的所有数据.
	当ename字段上添加索引的时候,以上sql语句会根据索引扫描,快速定位.

怎么创建和删除与索引?
	给emp表,sal字段添加索引
	create index emp_sal_index on emp(sal);

	删除索引:
	drop index emp_sal_index on emp;
什么时候考虑给给段添加索引?(满足什么条件)
	数据量庞大(根据客户的反应来看,有时机器nb,即使不添加索引也可以,有的机器拉垮,即使小表也得添加索引)
	该字段很难少的DML操作
	该字段经常出现在where子句中.

注意:主键和具有unique约束的字段会自动添加索引

查看sql语句的执行计划(只有mysql才有)
explain select ename, sal from emp where sal = 5000;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | emp   | NULL       | ALL  | NULL          | NULL | NULL    | NULL |   14 |    10.00 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+

注意查询结果中的type的值为ALL,说明是对全表扫描.
rows为14说明扫了14条记录.

若使用索引来检索
+----+-------------+-------+------------+------+---------------+---------------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key           | key_len | ref   | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+---------------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | emp   | NULL       | ref  | emp_sal_index | emp_sal_index | 9       | const |    1 |   100.00 | NULL  |
+----+-------------+-------+------------+------+---------------+---------------+---------+-------+------+----------+-------+

索引的底层采用的数据结构: B Tree

索引的实现原理:
	当执行创建索引命令之后,可能在内存也有可能在硬盘(具体看存储引擎)生成一个索引表.

	数据库中表的任何一条数据都有一个物理地址(物理地址在Oracle当中叫做rowid)

	当根据索引找到目标记录之后,会得到该记录的物理地址,相应的查询语句发生变化.

	select ename, sal from emp where 物理地址 = ... ;	//这条语句不再走表,直接查询存储位置.

	原理总结: 通过B Tree缩小扫描范围,底层索引进行了排序,分区,索引会携带数据在表中的"物理地址",
	最终通过索引检索到数据之后,获取到关联的物理地址,通过物理地址定位表中的数据,效率是最高的.

索引为分类:
	单一索引
	符合索引
	主键索引
	唯一索引

索引什么时候失效?
	模糊查询的时候,第一个通配符使用的是%,这个时候索引是失效的,还有其他情况.
	select ename from emp where ename like '%A%' 	//索引不知道第一个字母是什么,无法定位分区,最终还是遍历查询

视图(view):
	什么是视图?
		站在不同的角度去看数据(同一张表的数据,通过不同的角度去看待)

	如何创建视图?怎么删除视图?
		create view myview as select empno, ename from emp;
		drop view myview;

	注意只有DQL语句才能以视图对象的方式创建出来,
	但是可以对视图进行CRUD操作.

	对视图进行CRUD会影响到原表数据.(通过视图影响原表数据的,不是直接操作的原表)

	为什么要使用视图?
		像一些公司不希望在外包程序的时候,把数据库的具体信息公布出来,所以创建出视图,让外包公司对视图进行操作.
		视图可以隐藏表的实现细节.保密级别较高的系统,可能只对外提供相关的视图,Java程序员只对视图对象进行CRUD,甚至连数据也不公布