数据库基础

  • count(*), count(1),count(col)区别

count(1)和count(*)没有任何区别(执行计划和统计信息),而且都是统计所有行
count(col)统计col列不为空的记录,如果有索引,不管col是否为空,都能走索引

  • 聚集索引
  • SQL聚集索引与非聚集索引的区别
  1. 聚集索引一个表只能有一个, 而非聚集索引一个表可以存在多个.
  2. 聚集索引存储记录是在物理上连续存在, 而非聚集索引是逻辑上的连续,物理存储并不连续.
    Q1. 聚集索引的约束是唯一性, 是否要求字段也是唯一的?
    聚集索引可以创建在任何一列你想创建的字段上, 这是从理论上讲, 实际情况并不能随便指定, 否则在性能上会是噩梦.
    Q2. 为什么聚集索引可以创建在任何一列上, 如果此表没有主键约束, 即有可能存在重复行数据呢?
    如果未使用UNIQUE属性创建聚集索引, 数据库引擎将向表自动添加一个四字节uniqueifier列. 必要时, 数据库引擎将向行自动添加一个uniqueifier值, 使每个键唯一,此列和列值供内部使用, 用户不能查看或访问.
    Q3. 是不是聚集索引就一定比非聚集索引性能优呢?
    如果想查询学分在60-90之间的学生的学分以及姓名,在学分上创建聚集索引是否是最优的呢?
    答:否。既然只输出两列,我们可以在学分以及学生姓名上创建联合非聚集索引,此时的索引就形成了覆盖索引,即索引所存储的内容就是最终输出的数据,这种索引在比以学分为聚集索引做查询性能更好。
    Q4. 在数据库中通过什么方式描述聚集索引与非聚集索引的?
    索引是通过二叉树形式进行描述的, 我们可以这样区分聚集与非聚集索引的区别: 聚集索引的叶节点就是最终的数据节点, 而非聚集索引的叶节点仍然是索引节点, 但是它有一个指向最终数据的指针.
    Q5. 在主键是创建聚集索引的表在数据插入上为什么比主键上创建非聚集索引表速度要慢?
    在有主键的表中插入数据行,由于有主键唯一性的约束,所以需要保证插入的数据没有重复。我们来比较下主键为聚集索引和非聚集索引的查找情况: 聚集索引由于索引叶节点就是数据页,所以如果想检查主键的唯一性,需要遍历所有数据节点才行,但非聚集索引不同,由于非聚集索引上已经包含了主键值,所以查找主键唯一性,只需要遍历所有的索引页就行,这比遍历所有数据行减少了不少IO消耗。这就是为什么主键上创建非聚集索引比主键上创建聚集索引在插入数据时要快的真正原因。

重点:

  • 聚集索引的叶节点上存储的就是数据, 非聚集索引的叶节点上存储的是指向最终数据的指针.