引言
在现代应用程序开发中,大数据处理已成为常见需求。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();
738

被折叠的 条评论
为什么被折叠?



