一.索引
1.索引介绍:
查询复杂度:这的是查询的次数,测试复杂度采用的是悲观态度。复杂度用O(x)表示。
常规的查询:指顺序查询,按照顺序查询到结果为结束。复制速度为O(n).。比如我想查找一个容量为20的数据,查到第5个是想要 的结果,那复杂度也是O(20).
排序的目的是为了提高查询效率
对于MySQL任意一张表,常规使用的查询方法也是顺序查找。
树结构:
根节点
内部结点
叶子节点
Mysql为了优化查询,提出索引概念。
当用户创建索引的时候,mysql首先复制数据,完成一个新的Btree(平衡树)数据结构,mysql 索引默认用的时候B+tree结构。
平衡树:左树和右树高度相差不能高过1。
1.有一个根节点,根节点为空或者有一个记录和有两个子节点。
2 .每个节点当做key和指针相互分割,指针指向子节点。
3.d表示输的宽度,除叶子节点之外,其他每个节点有(d/2,d-1)条数据,而且key从做导游从大到小排列。
4.在一个子节点当做,第n个字数所有key,小于这个节点当做的第n个key,大于这个节点,当做的第n-1个key。
5.所有的叶子节点必须在同一层次上。
用二分查找(logn)
索引是数据结构,可以加快我们的查询效率。单数创建索引需要我们复制数据,会占用资源。
使用索引的区间:
当我们使用索引后,查询指定数据返回的数据是总数据的3%-5%我们认为是合适的。
少量数据不适合使用索引。
2.索引的设立:
索引分类:
普通索引 就是一个普通索引,可以为空,可以重复。
ALTER TABLE teacher ADD INDEX(column)
唯一索引:可以为空,不可以重复
ALTER TABLE teacher ADD UNIQUE(column);
ALTER TABLE teacher ADD column type UNIQUE;
主键索引:不可以为空,不可以重复。(只要是主键,就是索引)
ALTER TABLE teacher ADD PRIMARY KEY(column);
多列索引:
ALTER TABLE teacher ADD INDEX(column1,column2,column3);
使用索引:
1.少量数据不使用索引,
2.查询次数少,不使用索引,
3.查询要携带索引字段,通常放在select 之后第一个。
4.索引提高了查询的效率,占用更多的资源。
3.索引的删除
DROP INDEX 索引名 on 表名;
4.查看索引
SHOW INDEX 索引名 on 表名;
5,索引的优点:
- 提高数据检索效率
- 创建唯一索引,保证数据库表中每一行数据的唯一性。
- 加速表与表之间的连接,特别是在实现数据参考完整性方面特别有意义。
-
在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
-
通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
6.索引的缺点:
- 索引占用了一定的物理空间
- 创建和维护索引要耗费时间,且耗费的时间随数据量的增加而增加。
-
当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
注意:有索引的列增删改的速度比没索引的要慢得多。(比如:你要把《西游记》放到书架里,没有索引直接随便放一个书架就可以了,速度很快;但是有索引的时候,你需要依次找到:文学–>古典文学–>中国古典文学…一直到四大名著,然后把《西游记》放进去,速度慢的多。)
7.不推荐创建索引的情况:
-
少量数据不使用索引,
-
查询次数少,不使用索引,
-
定义为text和image和bit数据类型的列不要增加索引。
二.视图
View:当查询的复杂度比较大,多表,多关系,会导致查询语句混乱,不利于sql语句的编写和编 写的sql语句的可读性。于是mysql推出了视图模式。
视图模式是对一个查询的结果进行记录,世图里面只存放语句,不存放结果,类似于虚表。
1.视图优点:
1、简单,试图构建了一个虚拟的逻辑表,这个表里面的数据来自于指定的查询,而查询可 以是多表联查。在使用的时候,我们可以直接对试图表里面的数据进行查询,不用从原始 表查。
2、安全,数据库有权限设置,但是没有对行和列的权限。所以如果对一个表里的数据设置 不同的权限,mysql本身的权限设置有些不够,我们用试图查询出用户需要的数据,用户基 于试图进行查询。
3、数据独立,一旦试图试图的结构决定,可以屏蔽表结构变化给用用户带来的影响,在原 表当做增加一列。
2.视图的缺点:
试图会降低查询的效率。尤其在试图当做的查询当做再次使用试图。
创建视图:
CREATE VIEW 视图名 AS(基本语法)
例如
CREATE VIEW student_sun AS( SELECT name,age FROM student where name like "%赵%");
3.视图的使用:
比如 student 表中有name gender age 字段 但是age 字段不想被查看的人看见,所以需要使用视图。
CREATE VIEW student_sun AS(select name,gender from student where name like "%赵%");
这样age字段 就不会被看见了。
4.删除视图:
DROP VIEW 视图名