zoukankan      html  css  js  c++  java
  • 表连接 索引

    表连接

    INNER JOIN:如果表中有至少一个匹配,则返回行

    LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行

    RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行

    FULL JOIN:只要其中一个表中存在匹配,则返回行

    索引

    一般来说,应该在这些列上创建索引:

    1. 主键列,强制该列的唯一性和组织表中数据的排列结构;
    2. 外键列,可以加快连接的速度;
    3. 经常需要搜索的列,可加快搜索速度;
    4. 经常需要排序的列,利用索引的排序,加快排序查询时间;
    5. 经常需要根据范围进行搜索的列,索引已经排序,其指定的范围是连续的;(聚集)
    6. 经常使用在WHERE子句中的列,加快条件的判断速度。
    7. 经常出现在order by、group by、distinct后面的字段,建立索引。如果建立的是复合索引,索引的字段顺序要和这些关键字后面的字段顺序一致,否则索引不会被使用。
    8. 经常更新的列(非聚集索引)
    9. 小数目的不同值(建议聚集索引)
    10. 大数目的不同值(建议非聚集索引)

    一般来说,不应该在这些列上创建索引:

    1. 在查询中很少使用列。有索引并不能提高查询速度,反而降低了系统的维护速度和增大了空间需求。
    2. 只有很少数据值的列。由于这些列的取值很少,在查询的结果中,需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。
    3. 定义为text, image和bit数据类型的列。这些列的数据量要么相当大,要么取值很少。
    4. 当修改性能远远大于检索性能时,不应该创建索引。修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。
    5. 重复值比较多的列不要建立索引
    6. 经常存取的列避免建立索引 

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

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

    唯一索引 UNIQUE

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

    既可以采用聚集索引结构,也可以采用非聚集索引的结构,如果不指明采用的索引结构,则SQL Server系统默认为采用非聚集索引结构

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

    主键索引

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

    在数据库关系图中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型。该索引要求主键中的每个值都唯一。当在查询中使用主键索引时,它还允许对数据的快速访问。

    聚集索引CLUSTERED、NONCLUSTERED

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

    非聚集索引,表中行的物理顺序与键值的逻辑顺序不匹配,相比之下,聚集索引通常提供更快的数据访问速度。

    语法

    CREATE [UNIQUE][CLUSTERED | NONCLUSTERED]  INDEX  index_name 

    ON {table_name | view_name} [WITH [index_property [,....n]]

     

    DROP INDEX table_name.index_name[,table_name.index_name]

    总结

    限制表上的索引数目。存在大量更新操作的表,所建索引的数目一般不超过3个,最多5个。索引虽说提高了访问速度,但太多索引会影响数据的更新操作。

    in、or子句常会使用工作表,使索引失效

    如果不产生大量重复值,可以考虑把子句拆开

    拆开的子句中应该包含索引

    任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。

    用B-Tree作为索引结构效率是非常高的,应该花时间学习B-树和B+树数据结构

    为什么使用B+树?

    1.文件很大,不可能全部存储在内存中,故要存储到磁盘上

    2.索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数(为什么使用B-/+Tree,还跟磁盘存取原理有关,具体看下边分析)

    3. 局部性原理与磁盘预读,预读的长度一般为页(page)的整倍数,(在许多操作系统中,页得大小通常为4k)

    4. 数据库系统巧妙利用了磁盘预读原理,将一个节点的大小设为等于一个页,这样 每个节点只需要一次I/O 就可以完全载入,(由于节点中有两个数组,所以地址连续)。而红黑树这种结构, h 明显要深的多。由于逻辑上很近的节点(父子)物理上可能很远,无法利用局部性

  • 相关阅读:
    CODING x 百果园 _ 水果零售龙头迈出 DevOps 体系建设第一步
    Nocalhost 亮相 CD Foundation 国内首届 Meetup,Keith Chan 将出席致辞
    做云原生时代标准化工具,实现高效云上研发工作流
    打造数字化软件工厂 —— 一站式 DevOps 平台全景解读
    WePack —— 助力企业渐进式 DevOps 转型
    CODING Compass —— 打造行云流水般的软件工厂
    Nocalhost —— 让云原生开发回归原始而又简单
    CODING 代码资产安全系列之 —— 构建全链路安全能力,守护代码资产安全
    Nocalhost:云原生开发新体验
    使用 Nocalhost 开发 Kubernetes 中的 APISIX Ingress Controller
  • 原文地址:https://www.cnblogs.com/whatarewords/p/10711387.html
Copyright © 2011-2022 走看看