知识点 - 数据库索引
问题场景:
在用 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


浙公网安备 33010602011771号