SQLSugar大数据处理优化汇总

AgenticCoding·十二月创作之星挑战赛 10w+人浏览 430人参与

引言

在现代应用程序开发中,大数据处理已成为常见需求。SQLSugar作为一款轻量级、高性能的ORM框架,在处理大规模数据时具有显著优势。本文汇总了SQLSugar在大数据场景下的优化策略和实践经验,帮助开发者充分发挥其性能潜力。

一、查询优化策略

1.1 分页查询优化

// 传统分页(大数据量下性能较差)
var page1 = db.Queryable<Order>()
    .Skip(20)
    .Take(10)
    .ToList();

// 优化方案1:使用键值分页(推荐)
var lastMaxId = 100;
var page2 = db.Queryable<Order>()
    .Where(it => it.Id > lastMaxId)
    .Take(10)
    .ToList();

// 优化方案2:SQLSugar分页扩展
var page3 = db.Queryable<Order>()
    .ToPageList(2, 10, ref totalCount);

1.2 选择性加载字段

// 避免SELECT * 查询
var data = db.Queryable<Order>()
    .Select(it => new { it.Id, it.OrderNo, it.CreateTime })
    .ToList();

// 使用IgnoreColumns忽略大字段
var data2 = db.Queryable<Order>()
    .IgnoreColumns(it => new { it.Detail, it.Attachments })
    .ToList();

1.3 查询条件优化

// 使用索引字段作为查询条件
var result = db.Queryable<Order>()
    .Where(it => it.IndexedColumn == value)
    .ToList();

// 避免在WHERE中使用函数计算
// 不推荐
var badQuery = db.Queryable<Order>()
    .Where(it => it.CreateTime.ToString("yyyy-MM-dd") == "2024-01-01")
    .ToList();

// 推荐
var goodQuery = db.Queryable<Order>()
    .Where(it => it.CreateTime >= DateTime.Parse("2024-01-01") 
              && it.CreateTime < DateTime.Parse("2024-01-02"))
    .ToList();

二、批量操作优化

2.1 批量插入优化

// 小批量数据(<1000条)
db.Insertable(list).ExecuteCommand();

// 大批量数据(推荐使用BulkCopy)
db.Fastest<Order>().BulkCopy(list);

// 可配置的批量操作
db.Insertable(list)
    .UseParameter()  // 使用参数化
    .PageSize(1000)  // 每批1000条
    .ExecuteCommandAsync();

2.2 批量更新优化

// 分批次更新
db.Updateable(list)
    .PageSize(500)
    .ExecuteCommand();

// 使用BulkUpdate
db.Fastest<Order>().BulkUpdate(list);

// 条件批量更新
db.Updateable<Order>()
    .SetColumns(it => it.Status == 1)
    .Where(it => it.CreateTime < DateTime.Now.AddDays(-30))
    .ExecuteCommand();

2.3 批量删除优化

// 分页删除(避免大事务)
int pageSize = 5000;
int totalDeleted = 0;
bool hasMore = true;

while (hasMore)
{
    var ids = db.Queryable<Order>()
        .Where(it => it.Status == -1)
        .Select(it => it.Id)
        .Take(pageSize)
        .ToList();
        
    if (ids.Count > 0)
    {
        db.Deleteable<Order>()
            .In(ids)
            .ExecuteCommand();
        totalDeleted += ids.Count;
    }
    else
    {
        hasMore = false;
    }
}

三、SQLSugar特性利用

3.1 二级缓存优化

// 开启查询缓存
var data = db.Queryable<Order>()
    .Where(it => it.Status == 1)
    .WithCache(60)  // 缓存60秒
    .ToList();

// 自定义缓存键
var data2 = db.Queryable<Order>()
    .Where(it => it.UserId == userId)
    .WithCache($"user_orders_{userId}", 300)
    .ToList();

3.2 读写分离支持

// 配置读写分离
var db = new SqlSugarClient(new ConnectionConfig()
{
    ConnectionString = "writeConn",
    DbType = DbType.SqlServer,
    IsAutoCloseConnection = true,
    SlaveConnectionConfigs = new List<SlaveConnectionConfig>()
    {
        new SlaveConnectionConfig(){ ConnectionString = "readConn1" },
        new SlaveConnectionConfig(){ ConnectionString = "readConn2" }
    }
});

// 强制读主库
var data = db.Queryable<Order>().With(SqlWith.NoLock).ToList();

3.3 异步操作

// 异步查询
var data = await db.Queryable<Order>()
    .Where(it => it.Status == 1)
    .ToListAsync();

// 异步批量操作
await db.Fastest<Order>().BulkCopyAsync(list);

四、数据库层面优化

4.1 索引优化建议

// 在实体类中标注索引
[SugarIndex("idx_order_status", nameof(Status), OrderByType.Asc)]
[SugarIndex("idx_order_user", nameof(UserId), OrderByType.Asc, nameof(CreateTime), OrderByType.Desc)]
public class Order
{
    [SugarColumn(IsPrimaryKey = true)]
    public long Id { get; set; }
    
    public int Status { get; set; }
    public long UserId { get; set; }
    public DateTime CreateTime { get; set; }
}

4.2 分区表支持

// 创建分区表
db.CodeFirst.SplitTable<Order>().InitTable(
    t => t.CreateTime >= DateTime.Parse("2024-01-01"),
    t => t.CreateTime >= DateTime.Parse("2024-02-01")
);

// 分区表查询
var data = db.Queryable<Order>()
    .SplitTable(tabs => tabs.InTableNames("Order_202401", "Order_202402"))
    .Where(it => it.CreateTime >= DateTime.Parse("2024-01-01"))
    .ToList();

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

code_shenbing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值