索引_笔记

索引:

索引,使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种

结构。

在关系数据库中,索引是一种与表有关的数据库结构,它可以使对应于表的sql语句执行的更快。索引的作用

相当于图书的目录,可以根据目录中的页码快速找到所需的内容。当表中有大量记录时,若要对表进行查询,

第一种搜索信息方式是全表搜索,是将所有记录一一取出,和查询条件进行一一对比,然后返回满足

条件的记录,这样做会消耗大量数据库系统是将,大量磁盘i/o操作;第二种就是在表中建立索引,然

后在索引中找到符合查询条件的索引值,最后通过保存在索引中的rowid(相当于页码)快速找出表中

对应的记录。

索引是一个单独的,物理的数据库结构,它是某个表中一列或若干值的集合和相应的指向表中

物理标识这些值的数据页的逻辑指针清单。

索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序,

数据库中使用索引的方式与您使用书籍中的索引方式很类似:它搜索索引以找到特定值,然后顺时针

找到包含该值得行。

在数据库关系图中,可以在选定表的“索引/键“属性页中创建,编辑或删除每个索引类型。当

保存索引所附加到的表,或保存该表所在的关系图时,索引将保存在数据库中。

旧称通简,备检或引得。组成的基本单位是索引款目。款目一般包括索引词,说明或注释语,出处

3项内容。所有索引款目实现有序化编排。其本质特征是只揭示内容出处或文献线索,并不直接提供

事实,资料本身。主要功能是为人们准确,迅速地获得文献资料提供线索性指导。

在数据库系统中建立索引主要有以下作用:

(1)快速取数据

(2)保证数据记录的唯一性

(3)实现表与表之间的参照完整性

(4)在使用order by,group by子句进行检索时,利用索引可以减少排序和分组时间。

索引优点:

1.大大加快数据的检索速度;

2.创建唯一性索引,保证数据库表张每一行数据的唯一性。

3.加速表和表之间的连接

4.在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间

索引缺点:

1.索引需要占物理空间

2.当对表中的数据进行增加,删除和修改的时候,索引也要动态的维护,降低了数据的维护速度

在创建索引之前,必须确定要使用哪些列以及要创建的索引类型。

索引类型

根据数据库的功能,可以在数据库设计器中创建四种索引:普通索引,唯一索引,主键索引和

聚集索引。

普通索引:

这是最基本的索引类型,而且它没有唯一性之类的限制。普通索引可以通过下面几种方式创建:

创建索引,例如create index<索引名字> on tablename(列的列表);

修改表,例如alter table tablename add index [索引名字](列的列表);

创建表的时候指定索引,例如create table tablename([...],index[索引名字](列的列表));

唯一索引:

唯一索引是不允许其中任何两行具有相同索引值得索引。

当现有数据中存在重复的键值时,大多数据库不允许将新创建的唯一索引与表一起保存。数据库还可

能防止添加将在表中的创建重复键值的新数据。例如,如果在employee表中职员的性lname上

创建了一个索引,则任何两个员工都不能同性。

创建唯一索引的几种方式:

创建索引,例如create unique index<索引的名字> on tablename(列的列表);

修改表,例如alter table tablename add unique [索引名字](列的列表);

创建标的时候指定索引,例如create table tablename([...],unique[索引的名字](列的列表));

主键索引:

数据库表经常有一列或列组合,其值唯一标识表中的每一行,该列称为表的主键。

在数据库关系图中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型。该索引

要求主键中每个值都唯一。当在查询中使用主键索引时,它还允许对数据的快速访问。

尽管唯一索引有助于定位信息,但为获得最佳性能结果,建议改用主键索引。

聚集索引:

在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个聚集索引。

如果某索引不是聚集索引,则表中行的物理顺序与键值的逻辑顺序不匹配。聚集索引通常提供更快

的数据访问速度。

注意事项

并非所有的数据库都以相同的方式使用索引。作为通用规则,只有当经常查询索引列中的数据时,才

需要在表中创建索引。索引占用磁盘空间,并且降低添加,删除和更新行的速度。在多数情况下,索引

用于数据检索的速度优势大大超过它的不足之处。但是如果应用程序非常频繁地更新数据或者磁盘空间

有限,则可能需要限制索引的数量。

可以基于数据库表中的单列或多列创建索引。多列索引使您可以区分其中一列可能有相同值得行。

如果经常同时搜索两列或多列或按两列或多列排序时,索引也很有帮助。例如,如果经常在同一查询

中为姓和名两列设置判据,那么在这两列创建多列索引将很有意义。

确定索引的有效性:

检查查询的where和join子句。在任一子句中包括的每一列都是索引可以选择的对象。

对新索引进行试验以检查它对运行查询性能的影响。

考虑已在表上创建的索引数量。最好避免在单个表上有很多索引。

检查已在表上创建的索引的定义。最好避免包含共享列的重叠索引。

检查某列中唯一数据值的数量,并将该数量与表中的行数进行比较。比较的结果就是该列的可选择性,

这有助于确定是否适合建立索引,若适合,确定索引类型

Create index PersonIndex

On Person(LastName)

Mysql创建视图,索引:

数据库的三级模式两级映射:

存储文件-->基本表-->视图

内模式-->模式-->外模式

一.视图

1.什么是视图?

视图是从一个或多个表中导出来的表,是一种虚拟存在的表。

视图就像一个窗口,通过这个窗口可以看到系统专门提供的数据。

这样,用户可以不用看到整个数据库中的数据,而只关心对自己有用的数据。

数据库中只存放了视图的定义,而没有存放视图中的数据,这些数据存放在原来的表中。

使用视图查询数据时,数据库系统会从原来的表中取出对应的数据。

视图中的数据依赖于原来表中的数据,一旦表中数据发生改变,显示在视图中的数据也会发生改变

2.视图的作用:

   (1)使操作简单化,可以对经常使用的查询定义一个视图,使用户不必为同样的查询操作指定条件

   (2)增加数据的安全性,通过视图,用户只能查询和修改指定的数据。

   (3)提高表的逻辑独立性,视图可以屏蔽原有表结构变化带来的影响

3.视图操作sql:

创建视图:

Create view viewName(参数列表/可以不写这样就默认和下面的select一样)as select * from 表名

例1:

(1) create table viewdemo(id int primary key,name varchar(10),score float);

(2) Create view view1 as select * from viewdemo;

(3) Create view view2(name,score) as select name,score from viewdemo;

修改视图:

Alter view viewname(column) as select columns from tableName;

Alter view view2(id,name) as select id,name from viewdemo;

二.索引

1.什么是索引

索引是一个单独的、存储在磁盘上的数据库结构,它们包含着对数据库表里所有记录的引用指针。

Mysql中索引的存储类型有两种:Btree和hash,具体和表的存储引擎有关。Mysqlam和innoDB存储引擎

只支持btree索引。

2.索引的好处

适当使用索引能提升数据库查询速度

3.在创建表的时候创建索引

Create table 表名[列名称 数据类型]

[unique|fulltext][index|key][索引名称](列名称[length])[ASC|desc]

(1)普通索引index:是mysql的基本索引类型,允许在定义索引的列中插入重复值和空值。

Create table book

(

Bookid int not null,

Bookname varchar(100) not null,

Authors varchar(100) not null,

Info varchar(500) null,

Year_publication year not null,

Index(year_publication)

);

(2)唯一索引unique:唯一索引列的值必须唯一,但允许有空值。主键索引是一种特殊的唯一索引,不允许有空值

Create table book

(

Id int not null,

Name char(50) not null,

Unique index uniqueIdx(id)

);

(3)联合索引:组合索引即是在多列上创建索引。查询时,只有在查询条件中使用了这些字段(创建组合索引的

时候指定哪些列)的最左边字段是,索引才会被使用。

Create table strudent

(

Id int not null,

Name char(50) not null,

Age int not null,

Info varchar(200),

Index multidx(id,name,age)

);

(4)全文索引:mysql  mysqlam存储引擎支持fulltext索引,并且类类型为char,text,varchar。并且

需要指定表的存储引擎为mysqlal。

Creaete table t4

(

Id not null,

Name varchar(50) not null,

Age int not null,

Info varchar(200),

Fulltext index fullindexname(info)

)engine=mysqlam;

在已经存在的表上创建索引:

语法:

Alter table table_name add[unique|fulltext][index|key][index_name](col_name[length],...)[asc|desc]

(1)普通索引 alter table book add index indexName(bookname(30));

(2)唯一索引:alter table book add unique index UniqueIdx(bookid);

(3)组合索引:alter table t6 add fulltext index infilx(info);

使用create index 创建索引:

语法:

Create [unique|fullText] [index|key} index index_name on table_name(col_name{length],...)[asx|desc]

例:在表book的bookname字段建立名为BkNameidx的索引。

Create index BkNameIdx on book(bookname);

例:在book表的bookId字段建立唯一索引。

Create unique index UniqueIdx on book(bookId);

4.删除索引;

(1)alter table table_name drop index index_name;

(2)Drop index index_name on table_name;

5.总结:

这样我们的视图和索引就建立了,是不是建立了视图我们可以使用show table查看,是不是已经建立了索引以及是不是

有效我们也可以使用explain select * from student where name=’sss’;来查看这样就会出现一张表其中就有select_type按这里

的查询类型我们就可以知道是不是建立的索引有效。
当我们建立了表,视图,索引之后如果你想删除则要考虑这样一个问题,即和这个表有关的所有对象都删除还是只

删除这个表;

Cascade(级联)restrict(限制)以上的是由这两个来完成。

Delete table student cacade;删除所有和student表相关的对象(视图,索引,触发器)。

Delete table student strict;只删除student表。

解释:聚集索引就是逻辑顺序和物理顺序保持一致,所以只能建立一个聚集索引,但可以建立多个唯一索引等。

索引:

 注:笔记部分可能参考其他作者内容的一个记录,仅为加深自己对概念的理解,这里一些可能忘记参考谁的了,所以望见谅。

原文地址:https://www.cnblogs.com/cangdingju/p/5520133.html