数据库索引(1)

数据库索引

概念:索引是对数据库表中一列或者多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。如果想按特定职员的姓名来查找他或她,则在表中搜索所有的行进行比较,索引有助于更快的获取信息。

索引分为聚簇索引和非聚簇索引,聚簇索引是按照数据存放的物理位置为顺序的,而非聚簇索引不一样;聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快。

根据数据库的功能 ,可以再数据库设计器中创建三种索引:唯一索引,主键索引和聚集索引。

唯一索引:不允许其中任何两行具有相同索引值的索引。当数据库中存在重复的键值时,大多数数据库不允许将新创建的唯一索引与表一起保存。数据库还可能防止添加将在表中创建重复键值的新数据。例如:如果在职员的姓上创建了唯一索引,则任何两个员工都不能同姓。

主键索引:数据库表经常有一列或多列组合,其值唯一标识表中的每一行。该列称为表的主键。在数据库关系图中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型。该索引要求主键中每个键值都唯一。当在查询中使用主键索引时,他还允许对数据的快速访问。

聚集索引:在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个聚集索引。如果某索引不是聚集索引,则表中行的物理顺序与键值的逻辑顺序不匹配。与非聚集索引相比,聚集索引通常提供更快的数据访问速度。聚集索引和非聚集索引的区别,如字典默认按字母顺序排列,读者如知道某个字的读音可根据字母顺序快速定位。因此聚集索引和表的内容是在一起的。如读者需要查询某个生僻词,则需按字典前面的索引,举例按偏旁进行定位,找到该字对应的页数,再打开对应页数找到该字。这种通过两个地方而查询到某个字的方式就如非聚集索引。

索引优点:

通过建立索引可以极大地提高在数据库中获取所需信息的速度,同时还能提高服务器处理相关搜索请求的效率,从这个方面看索引有以下优点

1、在设计数据库时,通过创建一个唯一的索引,能够在索引和信息之间形成一对一的映射式的对应关系,增加数据的唯一性特点。

2、能提高数据的搜索及检索速度,符合数据库建立的初衷。

3、能够加快表与表之间的链接速度,这对于提高数据的参考完整性方面具有重要作用。

4、在信息检索过程中,若使用分组及排序子句进行时,通过建立索引能有效的减少搜索过程中所需分组及排序时间,提高检索效率。

5、建立索引之后,在信息查询过程中可以使用优化隐藏器,对于这个提高整个信息检索系统的性能具有重要意义。

缺点:

1、在数据库建立过程中,需要花费较多的时间去建立并维护索引,特别是随着数据量的增加,所花费的时间将不断递增。

2、在数据库中创建的索引需要占用一定的物理存储空间,这其中就包括数据表所占得数据空间以及所创建的每一个索引所占用的物理空间,如果有必要建立起局聚簇索引,所占用的空间还将进一步增加。

3、在对表中的数据进行修改时,例如对其进行增加、删除或者修改操作时,索引都需要进行动态的维护,这给数据库的维护速度带来了一定的麻烦。

索引和表的关联

首先,索引是树的结构,默认从小到大排序。

每个表有一个主键,MySQL会以主键的值构造成一棵树,叶节点存放着该主键对应的整行数据。所以一张表在数据表结构上等价于一课以主键排好序的树。

对于其他自己建的索引叫做辅助索引,辅助索引的叶节点存了两样东西,一是addtime,并且是排好序的,二是这个

addtime对应的主键的值。当有where条件,比如where addtime = ‘今天’,MySQL直接从addtime索引,先找到符合条件的addtime,再从叶子结点中取出主键,跑去主键的那棵树,取回整行数据。对区分高的字段加索引,有些像status,type,可能就只有0,1,2没几个值得意义不大。

索引组合:比如KEY(userID,addtime)就是叶子结点存储userID和addtime的配对,加上对应的主键。顺序是自己指定的顺序,先排userID,userID相同 的再排addtime。

如果查询条件有多个字段,有部分建立索引的。

如 a = 1 and b = 2 and c = 3,a和b分别有单独的索引。MySQL会看看到底是按a取得少还是按b取得少,如果a取得少,先把满足a=1的数据拿出来,这时候拿出了部分数据,b的索引就不用了,因为一次查询同一张表只能用一条索引。如果确实有多个索引的话,可以强制指定使用某个索引 select * from *** force index (ix_addtime);

对于JOIN查询,SELECT **** FROM t1 JOIN t2 ON t1.id = t2.id

MYSQL 先比较t1,t2哪个表小,假设t1小,这里主要指行数少,然后把t1里的id 全部取出来,这步是全表扫描,然后到t2里去根据这些id一个个查,所以这里优化的关键是t2的ID要加索引。小表因为要全表扫描,所以加了索引也是白家。小表决定循环的次数,大表决定每次循环的时间。如果小表有查询条件,先把小表符合条件的数据过滤出来,再根据id到大表查数据。

总结

  • MySQL以主键的值构造成一棵树,叶子结点存放着该主键对应的整行数据,以此为聚簇索引。
  • 其他的索引为辅助索引,叶子结点存放着索引字段的值及对应的主键的值。
  • 一般情况下,一次查询只能使用一条索引。
  • 对查询where条件中区分度高的字段加索引。
  • 联合索引,叶子结点存储的顺序以创建时指定的顺序为准,因此区分度高的放在左边,能被多个查询复用到的放在做左边。
  • 只select需要用到的字段,尽量避免select*。
  • 如有必要,可用FORCE INDEX强制索引。
  • 多标JOIN,先按各表的查询条件比较哪个开销小,从小表取出所有符合条件的,到大表循环查找。
  • 以下情况无法使用到索引,like通配符在最左边,not in,!=,<>,队列做函数的运算 ,隐式数据类型转换,OR子句。

猜你喜欢

转载自blog.csdn.net/qq_42159433/article/details/83444713