数据库索引

本文深入讲解数据库索引的设计原理与优化技巧,涵盖索引的优缺点、不同类型索引的应用场景及其创建方法。同时探讨了B树与红黑树在数据库索引中的作用。

数据库索引设计与优化:
    索引的优缺点:
    优点:
    1.大大加快数据的检索速度;   
    2.创建唯一性索引,保证数据库表中每一行数据的唯一性;   
    3.加速表和表之间的连接;   
    4.在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。
    缺点:
        第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
        第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
        第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
    使用索引的注意事项:
             1、索引列不能有空值。数据库设计时不要让字段的默认值为null。
            2、like语句操作,一般情况下不推荐,like "%aaa%"不会使用索引,而like“aaa%”可以使用索引。
    1、为什么要使用索引:  数据在磁盘上是以块的形式存储的。为确保对磁盘操作的原子性,访问数据的时候会一并访问所有的数据块。
             磁盘上的这些数据块与链表类似,及他们都包含一个数据段和一个指针,指针指向下一个节点的内存地址。
             比如:select * from t_usre where id=2 ,在查找时,首先会找到这个表第一条记录所在的数据库地址,直到发现id=1,并不是
               要查找的值,然后在数据低端找到了下一个数据块的地址,直到找到id=2。为了加快搜索速度,这里就出现了索引。
        2、 索引是对某个字段的排序的一种方式。对于表中某个字段建立索引会创建另一种数据结构,其中保存着字段的值,,每个值有指向与它
           相关的记录。这种索引的数据结构是经过排序的,因此可以使用二分法进行查找。         
            比如:上个表的Id字段进行索引,就是在数据库存储空间上创建一块专用的控件,把User表的所有的Id字段的值拿出来放到这里,并且对这些值进行排序,并且每个值都携带着这个Id对应的行所在数据块的地址。因为Id是进过排序的,按照一定的数据结构存储的,所以数据库引擎在查找的时候,比如说查找id为5,引擎就会计算,5大概在整个排序结构的大致地方, 然后到那里去拿出这个值看看是不是,不是的话就再次相应的向左或者向右移动去寻找。
            通俗的来讲,就是根据你指定的列,建立一个遵循一定数据结构的区域,这些区域可以快速定位到相应数据库字段所在的磁盘地址。
3、索引类型:
    1)根据数据库的功能,可以在数据库设计器中创建索引:唯一索引、主键索引和聚集索引。 尽管唯一索引有助于定位信息,但为获得最佳性能结果,建议改用主键或唯一约束。  
    唯一索引:   UNIQUE     例如:create unique index stusno on student(sno);
    表明此索引的每一个索引值只对应唯一的数据记录,对于单列惟一性索引,这保证单列不包含重复的值。对于多列惟一性索引, 保证多个值的组合不重复。
    主键索引:   primary key
    数据库表经常有一列或列组合,其值唯一标识表中的每一行。该列称为表的主键。   在数据库关系图中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型。该索引要求主键中的每个值都唯一。当在查询中使用主键索引时,它还允许对数据的快速访问。 
    聚集索引(也叫聚簇索引):cluster  
    在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个聚集索引。   如果某索引不是聚集索引,  则表中行的物理顺序与键值的逻辑顺序不匹配。与非聚集索引相比,聚集索引通常提供更快的数据访问速度。        
    2)根据数据表中数据存储的位置区分:聚集索引和非聚集索引。
        聚集索引:表数据按照索引的顺序来存储的,叶子节点存储了真实的数据行,不再有单独的数据页。
            在一张表中只能创建一个聚集索引,因为真实数据的物理顺序只可能是一种。(如果一张表中没有聚集索引,那么它被成为堆集,  这样的表中的数据行没有特定的顺序,所有的新行将被添加到表的末尾位置)
        非聚集索引:表数据存储与索引顺序无关。对于非聚集索引,叶节点包含索引字段值及纸箱数据也数据行的逻辑指针,该层紧邻数据页, 其数量与数据行数据量一    致。
    mysql的数据实现:innoDB使用聚集索引,MyISAM使用非聚集索引。
4、创建方向索引的准则
    索引是建立在数据库表中的某些列的上面。因此,在创建索引的时候,应该仔细考虑在哪些列上可以创建索引,在哪些列上不能创建索引。
    一般来说,应该在这些列上创建索引。
        第一,   在经常需要搜索的列上,可以加快搜索的速度;
        第二,   在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;
        第三,   在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;
        第四,   在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;
        第五,   在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;
        第六,   在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。 
    同样,对于有些列不应该创建索引。一般来说,不应该创建索引的的这些列具有下列特点:
        第一,  对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。
        第二,对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中, 结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。
        第三, 对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。
        第 四,当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少 索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。 
5、数据库的简单实现:
        1)数据以文本形式保存,就是将要保存的数据,写入文本文件。为了查询效率,数据库采用b树格式存储数据。
             什么是b树,先说二叉树,二叉查找树是一种查找效率非常高的数据结构,它有三个特点。
            (1)每个节点最多只有两个子树。
            (2)左子树都为小于父节点的值,右子树都为大于父节点的值。
            (3)在n个节点中找到目标值,一般只需要log(n)次比较。
        二叉查找树的结构不适合数据库,因为它的查找效率与层数相关。越处在下层的数据,就需要越多次比较。极端情况下,
        n个数据需要n次比较才能找到目标值。对于数据库来说,每进入一层,就要从硬盘读取一次数据,这非常致命,
        因为硬盘的读取时间远远大于数据处理时间,数据库读取硬盘的次数越少越好。
        2)B树是对二叉查找树的改进。它的设计思想是,将相关数据尽量集中在一起,以便一次读取多个数据,减少硬盘操作次数。        
            B树的特点也有三个。
            (1)一个节点可以容纳多个值。比如上图中,最多的一个节点容纳了4个值。
            (2)除非数据已经填满,否则不会增加新的层。也就是说,B树追求"层"越少越好。
            (3)子节点中的值,与父节点中的值,有严格的大小对应关系。一般来说,如果父节点有a个值,那么就有a+1个子节点。比如上图中,父节点有两个值(7和16),就对应三个子节点,第一个子节点都是小于7的值,最后一个子节点都是大于16的值,中间的子节点就是7和16之间的值。
            这种数据结构,非常有利于减少读取硬盘的次数。假定一个节点可以容纳100个值,那么3层的B树可以容纳100万个数据,如果换成二叉查找树,
            则需要20层!假定操作系统一次读取一个节点,并且根节点保留在内存中,那么B树在100万个数据中查找目标值,只需要读取两次硬盘。    
        3)索引:数据库以B树格式储存,只解决了按照"主键"查找数据的问题。如果想查找其他字段,就需要建立索引(index)。所谓索引,就是以某个字段为关键字的B树文件。假定有一张"雇员表",包含了员工号(主键)和姓名两个字段。可以对姓名建立索引文件,该文件以B树格式对姓名进行储存,每个姓名后面是其在数据库中的位置(即第几条记录)。查找姓名的时候,先从索引中找到对应第几条记录,然后再从表格中读取。
            这种索引查找方法,叫做"索引顺序存取方法"(Indexed Sequential Access Method),缩写为ISAM。它已经有多种实现
            (比如C-ISAM库和D-ISAM库),只要使用这些代码库,就能自己写一个最简单的数据库。
        4)高级功能:
        部署了最基本的数据存取(包括索引)以后,还可以实现一些高级功能。
        (1)SQL语言是数据库通用操作语言,所以需要一个SQL解析器,将SQL命令解析为对应的ISAM操作。
        (2)数据库连接(join)是指数据库的两张表通过"外键",建立连接关系。你需要对这种操作进行优化。
        (3)数据库事务(transaction)是指批量进行一系列数据库操作,只要有一步不成功,整个操作都不成功。所以需要有一个"操作日志",
            以便失败时对操作进行回滚。
        (4)备份机制:保存数据库的副本。
        (5)远程操作:使得用户可以在不同的机器上,通过TCP/IP协议操作数据库。
6、索引的创建:
    创建索引,这是最基本的索引,它没有任何限制。它有以下几种创建方式:
    CREATE INDEX indexName ON mytable(username(length)); 
    如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。
    修改表结构(添加索引)
    ALTER table tableName ADD INDEX indexName(columnName)
    创建表的时候直接指定
    CREATE TABLE mytable(   
    ID INT NOT NULL,   
    username VARCHAR(16) NOT NULL,  
    INDEX [indexName] (username(length))   
    );   

7、8、红黑树:是一种自平衡的二叉查找树,是一种高效的查找树。之前被称为二叉b树,后来改为红黑树,他有这良好的效率,可以在0(logN)时间内完成
        查找。增加,删除等操作。比如:java中的treeMap,jdk1.8中的HashMap都是基于红黑树结构来实现。                    
        eg:详细分析:https://blog.youkuaiyun.com/qq_31967569/article/details/81108755
     红黑树通过如下的性质定义实现自平衡:
        节点是红色或黑色。
        根是黑色。
        所有叶子都是黑色(叶子是NIL节点)。
        每个红色节点必须有两个黑色的子节点。(从每个叶子到根的所有路径上不能有两个连续的红色节点。)
        从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点(简称黑高)。   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值