本文已参与「新人创作礼」活动,一起开启掘金创作之路。
数据库基础流程图
如何存储数据?
1、存在硬盘的:不丢失;唯一的,多线程操作是不方便的;速度慢(SSD加快)
1.1、比如存储1000w条数据需要2G的空间,数据多体积大扫描自然就慢了(如果能扫描少一点,性能就能提升)。
2、按页存储,每一页固定为8KB(8096),同时任何一条数据不能跨页存储;数据长度不能超过8096
3、int/DateTime等长度小于数据页的,可以放入一个数据页,但是他的存储是按字段最大数据来进行查询的,所以如果字段太多浪费空间就多很多,字段类型空间范围尽量小
4、每8个数据页,会组成一个Extent里面,所有Extent就组成heap
5、IAM Page 管理数据页,记录好数据页在硬盘的具体位置
6、Index Page 索引页,索引是一个独立的、重复的存储,将数据位置再次存储起来
(使用索引会额外占一部分空间,不过它的体积小,扫描快)
注:1、如果使用text存储超过8KB,会存在另外一个Page(文本/图像页),数据页只存储一个路径(非常慢,因为先查询到一个路径,再通过路径查询到真正的数据)
索引
聚集索引
1、会把数据按照一定的规则进行排序
2、物理排序,会直接调整硬盘数据的发布
3、增加聚集索引要小心,毕竟是加快速度的最好办法,但是也有一定负担(额外占一部分空间)。
4、自增主键的话直接选择ID,GUID为主键时一般选择时间。\
非聚集索引
1、数据是无序的
2、他额外的维护了一份索引页数据,也可以加快查找(用到这个索引)
3、非聚集索引可以有多个,但是不是越多越好,因为每次更删改都会更新索引页(不要超过5个)\
建议
1、自增主键建聚集索引,如果是GUID就建非聚集索引将其他字段建聚集索引。
2、外键是要建立索引。(一般不建外建)
3、经常查询的条件,范围查找/大小比较/排序(一般用聚集);order by, group by, distinct
4、很少作为条件的就不要索引。
5、text/image字段不要索引。
6、索引个数要少,复合索引谨慎使用。
7、主建/外建 最好都是数值型,速度最快。
执行计划:
1、Table Scan:全表扫描 性能最差
2、Cluster Index Scan:性能最差,同上。(虽然有聚集索引但是并没有命中和全表扫描一样)
3、Index Seek(NoClustered):性能非常高
4、Index Scan:先Index,再扫描
5、Cluster Index Seek:性能最高