知识点 - 数据库索引

问题场景:

在用 Ef CodeFirst 进行映射的 Sql 中

数据量达到了 460 万以上

利用 Ef 的 Linq 查询效率会变得非常的慢

即使加上了分页

主要是因为分页需要先排序, 时间主要消耗在排序上

 

解决:

1.

首先考虑缓存, redis, 数据量太大, 对于单体的 redis 有点难以承受

单单 460W 的数据加上外键大概可能就达到了G的大小

这么大量的数据迁移到 redis 十分的慢

2. 

既然是时间消耗在排序上, 那么可以针对表建立聚集索引

这里描述下索引的知识点

数据库里面有索引, 分为聚集索引和非聚集索引

其中 聚集索引的意思是:

非聚集索引的意思是:

一般来说 数据库的生成 聚集索引会默认添加到 主键上

 

对于已经建立了主键聚集索引的表来说

不能直接删除主键的聚集索引

而是要先去除主键(不是主键字段,而是主键标识)

然后添加其他列的聚集索引

然后再添加回主键标识

ALTER TABLE TableA DROP CONSTRAINT PK_TableA
CREATE CLUSTERED INDEX Index_IndexGUID ON TableA(IndexGUID)
ALTER TABLE TableA ADD CONSTRAINT PK_TableA PRIMARY KEY NONCLUSTERED(ItemGUID)

 

这里建立了聚集索引之后,

查询效率从10秒缩短到1秒左右

 

Ef 中应用索引

在 Ef 中似乎不能直接注明索引

而是要通过先解除 主键的索引

   public override void Up()
        {
            CreateTable(
                "dbo.Teacher3",
                c => new
                    {
                        Id = c.Int(nullable: false, identity: true),
                        Name = c.String(),
                        Date = c.DateTime(nullable: false),
                    })
//.PrimaryKey(t => t.Id) .Index(t
=> t.Date, clustered: true); AddPrimaryKey("dbo.Teacher3", "Id"); } public override void Down() { DropIndex("dbo.Teacher3", new[] { "Date" }); DropTable("dbo.Teacher3"); }

 

 

 

参考链接: 

https://blog.csdn.net/vevisoft/article/details/53241586

http://www.cnblogs.com/yinchuan/p/5012879.html

 

posted @ 2018-07-03 10:19  `Laimic  阅读(188)  评论(1)    收藏  举报