索引_笔记
索引:
索引,使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种
结构。
在关系数据库中,索引是一种与表有关的数据库结构,它可以使对应于表的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表。
解释:聚集索引就是逻辑顺序和物理顺序保持一致,所以只能建立一个聚集索引,但可以建立多个唯一索引等。
索引:
注:笔记部分可能参考其他作者内容的一个记录,仅为加深自己对概念的理解,这里一些可能忘记参考谁的了,所以望见谅。