本文作者:小黑黑

[EFCore]数据库索引

小黑黑 11个月前 ( 05-13 ) 414 抢沙发
[EFCore]数据库索引摘要: 一、为什么使用索引?索引的作用       数据库索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问...

一、为什么使用索引?索引的作用

       数据库索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。索引的一个主要目的就是加快检索表中数据的方法,亦技能协助信息搜索者尽快的找到符合限定限制条件的即可的辅助数据结构。

二、索引的分类

       1、聚集索引

            聚集索引是一种对磁盘上实际数据重新组织以按特定的一列或多列值排序。由于聚集索引是给数据排序,不可能有多种排法,所以一张表只能建立一个聚集索引。

       2、非聚集索引

            非聚集索引不重新组织表中的数据,而是对每一行存储索引列值并用一个指针指向数据所在的页面。

三、索引的优缺点

       优点:

            1、创建索引可以大大提高系统的查询性能。

            2、可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。

        缺点:

            1、增加了数据库的存储空间。

            2、在插入和修改数据时要花费较多的时间。

四、使用场景

        1、在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度。

        2、在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的。

        3、在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序加快排序查询的时间。

        4、在经常使用Where子语句的列上面创建索引,加快条件的判断速度。

五、EF Core中创建索引

/// <summary>
/// 博客表
/// </summary>
public class Blog
{
    /// <summary>
    /// Id
    /// </summary>
    public int Id { get; set; }

    /// <summary>
    /// 标题
    /// </summary>
    public string Title { get; set; }

    /// <summary>
    /// Url
    /// </summary>
    public string Url { get; set; }

    public virtual ICollection<Post> Posts { get; set; }
}

/// <summary>
/// 文章表
/// </summary>
public class Post
{
    /// <summary>
    /// Id
    /// </summary>
    public int Id { get; set; }

    /// <summary>
    /// 标题
    /// </summary>
    public string Title { get; set; }

    /// <summary>
    /// 内容
    /// </summary>
    public string Content { get; set; }

    public int BlogId { get; set; }

    public virtual Blog Blog { get; set; }
}

/// <summary>
/// 用户表
/// </summary>
public class User
{
    /// <summary>
    /// Id
    /// </summary>
    public int Id { get; set; }

    /// <summary>
    /// 姓
    /// </summary>
    public string FirstName { get; set; }

    /// <summary>
    /// 名
    /// </summary>
    public string LastName { get; set; }
}

/// <summary>
/// 数据库上下文
/// </summary>
public class BloggingDbContext : DbContext
{
    public BloggingDbContext(DbContextOptions<BloggingDbContext> options) : base(options)
    {

    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {

        //为Blog表中的Url创建不唯一、非聚集索引
        modelBuilder.Entity<Blog>().HasIndex(p => p.Url);

        //为Blog表中的Title创建不唯一、非聚集索引,并设置筛选器条件
        modelBuilder.Entity<Blog>().HasIndex(p => p.Title).HasFilter("[Title] is not null");

        //为Post表中的Title创建唯一、非聚集索引
        modelBuilder.Entity<Post>().HasIndex(p => p.Title).IsUnique();

        //为Post表中的Content创建唯一、非聚集索引,并不设置筛选器条件
        modelBuilder.Entity<Post>().HasIndex(p => p.Content).IsUnique().HasFilter(null);

        //为User表中的FirstName和LastName创建复合索引,两列同时作为索引
        modelBuilder.Entity<User>().HasIndex(p => new { p.FirstName, p.LastName });
    }

    public DbSet<Blog> Blogs { get; set; }

    public DbSet<Post> Posts { get; set; }

    public DbSet<User> Users { get; set; }
}

其中为Blog设置筛选条件,如:[Title] is not null,是指Title列的值不为空时才为其设置索引。

分享到: 网站分享代码

发表评论

快捷回复:

评论列表 (暂无评论,414人围观)参与讨论

还没有评论,来说两句吧...