zoukankan      html  css  js  c++  java
  • 索引

    1、

      索引就是在数据库上创建的一个数据结构,在给某一个字段创建索引后,在根据该字段进行查询的时候会在这个数据结构中进行查询,以提高查询速度。索引通常是B树、B+树、B-树这种数据结构。比如对于一条查询语句:select * from order where price == 9,最简单也是最耗时的方法就是对price一条一条的进行查询,找出那些等于9的记录,而如果给price加上索引的话,就可以使用索引来快速的查找记录。例如使用下面这个简单的B树结构的索引来查找9,从根节点开始,只需要比较三次就找到它了,因为索引上保存了所在记录的指针,所以可以方便的找到所在记录的其他需要的值(也有的说是索引上保存了对应的主键值,使用这个主键值通过聚集索引来查找需要的数据)。

       

    2、

      我们平时建表的时候都会为表加上主键, 在某些关系数据库中, 如果建表时不指定主键,数据库会拒绝建表的语句执行。 事实上,一个没加主键的表,它的数据是无序的放置在磁盘存储器上,一行一行的排列的很整齐, 跟我们认知中的“表”很接近。如果给表加上了主键,那么表在磁盘上的存储结构就由整齐排列的结构转变成了树状结构,如下图所示,换句话说,就是整个表就变成了一个索引。没错, 再说一遍, 整个表变成了一个索引,也就是所谓的”聚集索引“。这就是为什么一个表中只能有一个主键, 即一个表中只能有一个“聚集索引”,因为主键的作用就是把 [表] 的数据格式转换成「索引(平衡树)」的格式放置。除了主键所使用的聚集索引外,我们平时经常提起和使用的常规索引都是非聚集索引。

       

    3、

      我们在前面了解到索引的结构是B树,当树在增加、删除的时候,会触发页的拆分或合并,这种频繁的操作会产生索引碎片,造成索引不连续,当索引碎片曾多时,是会影响查询效率的。因此要定期的清理索引碎片,一般的方法就是重建索引。

    4、

      使用create index来创建索引,格式为:create index 索引名 on 表名(字段名):

    create index pub_id_idx on titles([pub_id]);--在表titles中pub_id列上建立索引,索引名为pub_id_idx  

      如果想要创建唯一索引(索引所在的字段不能有重复的值)的话使用create unique index:

    create unique index title_id_idx on titles([title_id]);--建立值唯一索引

      索引中数据默认是升序排列的(所以查询得到的数据也是升序排列的),如果想要指定降序则在字段名后加desc:

    create index price_idx on titles([price] desc);--建立降序索引 

      使用drop index来删除索引:

    drop index titles.price_idx;--删除索引

      如果索引建立的字段就是select中需要的字段的话(比如下面的UserName字段),那么就不需要去数据库表中读取select需要的数据了,因为可以直接从索引中读到数据,这种索引又称为覆盖索引。

    create index name_idx on User([UserName]);
    select UserName from User where UserName = 'Rain';

       一个索引还可以建在两个或多个字段之上, 此时这两个字段的内容都会被同步至索引之中,这称为复合索引或组合索引。当一个查询会有多个查询条件的时候可以建立复合索引:

    create index name_age_idx on User([UserName], [Age]);
    Select UserName from [User] where UserName='Ryan' and Age=12;
    
    create index price_pages_idx on titles([price], [pages] desc);
    select [book_name], [price], [pages] from titles order by [price], [pages] desc;--按price升序排序,若price相等,再按pages降序排序

    5、

      为表设置索引付出的代价是:一是增加了数据库的存储空间,二是在插入、修改、删除数据时会额外花费一些时间,因为这时候索引也要随之变动。

      一般我们应该在下面的字段上创建索引:

       在查询非常频繁的列上。
       在经常需要排序的列上,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间。
       在经常需要根据范围进行搜索的列上,因为索引已经排序,其指定的范围是连续的。
       在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度。

      不应该创建索引的字段:

       当修改性能要求远高于检索性能要求时,不应该创建索引。
       尽量在唯一性高的字段上创建索引,不要在性别这种唯一性很低的字段上创建索引。
       建立索引的字段不应该太大,最好是数值,对于那些定义为text, image和bit数据类型的列不应该增加索引,这是因为,这些列的数据量要么相当大,要么取值相当少。

      转载及参考出处:

       http://www.cnblogs.com/anding/p/3254674.html

       http://www.cnblogs.com/aspwebchh/p/6652855.html

       http://blog.csdn.net/weiliangliang111/article/details/51333169

       http://blog.csdn.net/kennyrose/article/details/7532032

  • 相关阅读:
    高亮表格行或列
    点击表格获取表格行或列索引
    文本框仅可接收decimal
    实现表格自动计算
    实现一个超简单的开关
    Nginx反向代理中proxy_set_header参数说明
    两个目录中,删除其中一个目录中同名文件的做法
    监控某个目录是否被更改
    centos下升级git版本的操作记录
    linux下core file size设置笔记
  • 原文地址:https://www.cnblogs.com/milanleon/p/7649143.html
Copyright © 2011-2022 走看看