索引优化实战,掌握EF Core包含列的5大应用场景与避坑指南

第一章:索引包含列的核心概念与作用

在现代数据库系统中,索引是提升查询性能的关键机制。传统的索引通常仅包含用于排序和查找的键列(Key Columns),而“包含列”(Included Columns)则是一种优化技术,允许将非键列附加到索引的叶层级,从而避免回表操作,提升覆盖查询的效率。

包含列的基本原理

包含列不参与索引的排序结构,因此不会影响索引树的组织逻辑,但它们会被存储在索引的叶节点中。这意味着当查询所需的所有字段都存在于索引的键列或包含列中时,数据库引擎无需访问基础表即可完成数据检索,这类索引称为“覆盖索引”。

使用场景与优势

  • 减少 I/O 操作:避免从主表读取数据页
  • 提升查询速度:适用于 SELECT 列表中频繁出现的非搜索条件字段
  • 降低锁争用:减少对基表的访问频率

创建包含列的索引示例

以下是在 SQL Server 中创建带有包含列的非聚集索引的代码示例:
-- 在订单表上创建索引,以客户ID为键列,订单金额和状态为包含列
CREATE NONCLUSTERED INDEX IX_Orders_CustomerId
ON Orders (CustomerId)
INCLUDE (OrderAmount, Status);
该语句创建了一个以 CustomerId 作为索引键的非聚集索引,并将 OrderAmount 和 Status 存储在叶节点中。当执行如下查询时,可完全利用该索引完成数据获取:
SELECT OrderAmount, Status
FROM Orders
WHERE CustomerId = 1001;

适用性对比表

特性键列包含列
参与排序是否
支持过滤/查找是否
可包含大对象类型受限支持(如 VARCHAR(MAX))
通过合理使用包含列,可以在不增加索引键复杂度的前提下,显著提升特定查询的执行效率。

第二章:EF Core中包含列的五大应用场景

2.1 覆盖查询优化:减少回表操作的实践策略

在数据库查询优化中,覆盖索引能显著减少回表次数,提升查询性能。当索引包含查询所需全部字段时,数据库可直接从索引中获取数据,无需访问主表。
覆盖索引的应用场景
适用于高频查询且字段较少的场景,如用户状态查询、订单状态统计等。合理设计复合索引是关键。
示例与分析
-- 建立覆盖索引
CREATE INDEX idx_status_created ON orders (status, created_at, user_id);
-- 查询仅涉及索引字段
SELECT user_id, status FROM orders WHERE status = 'shipped';
该查询完全命中索引,避免了回表操作。索引字段顺序需匹配查询条件和投影字段。
  • 覆盖索引减少 I/O 操作,提升查询效率
  • 需权衡索引维护成本与查询性能增益
  • 避免过度索引导致写入性能下降

2.2 组合索引设计中包含列的高效利用

在组合索引设计中,合理安排列的顺序能显著提升查询性能。最左前缀原则是核心机制:只有当前导列被使用时,后续列才能被索引有效利用。
索引列顺序的影响
例如,建立组合索引 (user_id, status, created_at) 时:
CREATE INDEX idx_user_status_time ON orders (user_id, status, created_at);
该索引可高效支持以下查询:
  • WHERE user_id = 100
  • WHERE user_id = 100 AND status = 'paid'
  • WHERE user_id = 100 AND status = 'paid' AND created_at > '2023-01-01'
但若查询仅使用 status 或 created_at,则无法命中此索引。
覆盖索引优化
当查询字段全部包含在索引中时,数据库无需回表,极大减少I/O开销。例如:
SELECT status FROM orders WHERE user_id = 100;
由于 user_id 和 status 均在索引中,可直接返回结果,实现“覆盖索引”优化。

2.3 提升只读场景下查询性能的实际案例

在某电商平台的商品查询系统中,面对高并发的只读请求,团队引入了多级缓存架构以减轻数据库压力。
缓存层设计
采用 Redis 作为一级缓存,本地缓存(Caffeine)作为二级缓存,有效降低响应延迟。典型查询流程如下:

// 查询商品信息
public Product getProduct(Long productId) {
    String cacheKey = "product:" + productId;
    // 先查本地缓存
    Product product = localCache.get(cacheKey);
    if (product == null) {
        // 再查分布式缓存
        product = redisTemplate.opsForValue().get(cacheKey);
        if (product != null) {
            localCache.put(cacheKey, product); // 回填本地缓存
        }
    }
    return product != null ? product : dbQuery(productId);
}
上述代码通过两级缓存机制减少对数据库的直接访问。本地缓存响应时间在毫秒级以下,Redis 平均响应为 2~5ms,而数据库查询平均耗时 20ms 以上。
性能对比
方案平均响应时间QPS
直连数据库22ms800
仅Redis6ms3500
多级缓存1.8ms9000
通过引入缓存预热和热点探测机制,系统在大促期间稳定支撑了每秒上万次查询请求。

2.4 避免SELECT * 带来的性能瓶颈

在数据库查询中,使用 SELECT * 会带来显著的性能开销,尤其在表字段较多或存在大文本列时。数据库需提取所有列数据,增加 I/O 负担和网络传输量。
明确指定所需字段
应始终只查询必要的字段,提升执行效率并减少资源消耗。
-- 不推荐
SELECT * FROM users WHERE status = 'active';

-- 推荐
SELECT id, name, email FROM users WHERE status = 'active';
上述优化减少了不必要的字段读取,尤其当表中包含 TEXT 或 BLOB 类型时效果更明显。
对索引利用的影响
SELECT * 可能导致无法命中覆盖索引(Covering Index),迫使回表查询,增加随机 I/O。
  • 覆盖索引可直接返回索引中的数据,无需访问主键索引
  • 选择具体字段有助于优化器选择更优执行计划

2.5 在高并发报表查询中的应用模式

在高并发场景下,报表查询常面临响应延迟与数据库负载过高的问题。通过引入缓存预计算与读写分离架构,可显著提升系统吞吐能力。
缓存聚合策略
将高频查询的报表结果提前聚合并存储于 Redis 或分布式缓存中,设置合理过期时间,避免重复计算。
异步任务处理
使用消息队列解耦实时查询压力,关键流程如下:
  • 用户请求触发报表生成任务
  • 任务投递至 Kafka 队列
  • 后台 Worker 消费并执行数据聚合
  • 结果写入缓存供前端轮询获取
// 示例:异步报表任务分发
func DispatchReportTask(req ReportRequest) {
    data, _ := json.Marshal(req)
    producer.Publish("report_queue", data) // 发送至消息队列
}
该函数将报表请求序列化后投递至 Kafka,实现请求削峰与异步处理,降低主库压力。

第三章:包含列使用中的常见陷阱与规避方法

3.1 过度添加包含列导致索引膨胀问题

在创建覆盖索引时,为提升查询性能常使用包含列(INCLUDE),但过度添加非键列会导致索引页过大,引发索引膨胀。
索引膨胀的影响
  • 增加存储开销,每个数据页容纳的索引行减少
  • 导致更多页拆分和B树层级加深
  • 全索引扫描时I/O成本显著上升
示例:不当的包含列设计
CREATE INDEX IX_Orders_Inflated 
ON Orders (CustomerId)
INCLUDE (OrderDate, ProductName, Quantity, Price, Notes, Description, Metadata);
上述语句将大量大字段加入包含列,尤其Description和Metadata可能为VARCHAR(MAX),极大增加叶级页面体积。
优化建议
仅将真正用于投影(SELECT)且无法作为键列的高频字段加入INCLUDE,并避免文本、大型字符串类型。

3.2 数据更新性能下降的原因分析与应对

在高并发场景下,数据更新性能下降通常源于锁竞争、索引维护开销及日志写入延迟。
常见性能瓶颈
  • 行锁或间隙锁导致的事务阻塞
  • 频繁的二级索引更新增加 I/O 负担
  • redo log 和 binlog 刷盘策略不当引发延迟
优化策略示例
-- 使用批量更新减少事务提交次数
UPDATE user SET score = CASE id 
  WHEN 1 THEN 95 
  WHEN 2 THEN 87 
END WHERE id IN (1, 2);
该语句通过单条 SQL 批量更新,减少了网络往返和锁持有时间。配合 innodb_flush_log_at_trx_commit=2 可降低日志刷盘频率,在保证一定可靠性的同时提升吞吐。
架构层面优化
组件优化措施
应用层合并更新请求,异步处理非关键字段
数据库层调整隔离级别,使用覆盖索引

3.3 索引维护成本与查询收益的权衡策略

在数据库设计中,索引能显著提升查询效率,但其维护成本不可忽视。频繁的数据写入会触发索引重建,消耗额外I/O与CPU资源。
成本与收益分析维度
  • 查询频率:高频检索字段更适合建索引
  • 数据更新频率:高写入表应谨慎添加索引
  • 索引类型选择:B-Tree、Hash或GIN根据场景权衡
典型场景对比
场景建议策略
读多写少积极创建复合索引
写多读少仅保留必要索引
-- 示例:为订单表创建复合索引
CREATE INDEX idx_orders_user_status ON orders(user_id, status);
该索引优化了“按用户查状态”的常见查询,但每次插入/更新订单时需同步维护索引树结构,需评估其对写入吞吐的影响。

第四章:实战优化技巧与工具支持

4.1 使用SQL Server Profiler分析执行计划

SQL Server Profiler 是数据库性能调优的重要工具,能够捕获和分析查询执行过程中的详细事件流。
关键事件跟踪设置
在 Profiler 中配置跟踪时,应重点关注以下事件类别:
  • RPC:Completed:监控远程过程调用的执行情况
  • SQL:BatchCompleted:捕获批处理语句的执行耗时
  • SP:StmtCompleted:用于存储过程中单条语句的粒度分析
执行计划与性能指标关联
通过启用“Showplan XML”事件,可捕获查询的实际执行计划。结合 CPU、读取次数和持续时间等列,便于识别低效查询。
-- 示例:用于查找高逻辑读查询的T-SQL
SELECT TOP 10 
    text, 
    execution_count, 
    total_logical_reads / execution_count AS avg_logical_reads
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle)
ORDER BY avg_logical_reads DESC;
该查询利用动态管理视图(DMV)定位平均逻辑读取最高的语句,辅助定位需进一步通过 Profiler 深入分析的潜在瓶颈。

4.2 EF Core迁移中定义包含列的标准语法

在EF Core迁移中,可通过Fluent API或数据注解方式定义包含列(Included Columns)以优化索引性能。包含列不参与索引键的排序,但可提升覆盖查询效率。
使用Fluent API配置包含列
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Product>()
        .HasIndex(p => p.CategoryId)
        .IncludeProperties(p => new { p.Name, p.Price });
}
上述代码为CategoryId字段创建索引,并将Name和Price作为包含列加入索引页中,避免回表查询。
支持的数据类型与限制
  • 包含列不支持Text、NText、Image等大对象类型
  • 每条索引最多可包含1000列,总大小不得超过900字节
  • 包含列无法用于WHERE、JOIN或ORDER BY条件中的索引查找

4.3 利用IndexAttribute与Fluent API灵活配置

在EF Core中,索引的配置可通过数据注解或Fluent API实现。使用IndexAttribute可快速声明简单索引:
public class Product
{
    public int Id { get; set; }
    
    [Index("IX_Product_Name", IsUnique = true)]
    public string Name { get; set; }
}
该方式适用于单属性索引,但灵活性有限。 对于复杂场景,推荐使用Fluent API进行配置:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Product>()
        .HasIndex(p => p.Name)
        .IsUnique()
        .HasDatabaseName("IX_Product_Name");
}
此方式支持组合索引、过滤索引等高级特性,如:
  • 多字段联合索引:.HasIndex(p => new { p.Category, p.Price })
  • 条件索引:.HasFilter("Status = 1")
通过两者结合,可在简洁性与灵活性之间取得平衡。

4.4 监控索引有效性与使用率的最佳实践

监控索引的有效性是保障数据库性能的关键环节。低效或未被使用的索引不仅浪费存储资源,还会拖慢写入性能。
识别未使用索引
通过查询系统视图可定位长期未被访问的索引。以 PostgreSQL 为例:

SELECT 
    schemaname,
    tablename,
    indexname,
    idx_scan -- 索引扫描次数,若为0则可能未被使用
FROM pg_stat_user_indexes
WHERE idx_scan = 0;
idx_scan 表示该索引被使用的次数,持续为零表明其在实际查询中未被命中,建议结合业务逻辑评估是否删除。
定期评估索引效率
建立定期审查机制,推荐以下策略:
  • 每月分析一次 pg_stat_user_indexes 和 pg_stat_user_tables
  • 重点关注高维护成本但低访问频率的索引
  • 结合执行计划(EXPLAIN ANALYZE)验证关键查询是否命中预期索引
合理维护索引使用率数据,有助于优化查询性能与资源利用率。

第五章:总结与未来优化方向

性能监控与自动化调优
在高并发系统中,持续的性能监控是保障服务稳定的核心。通过 Prometheus 采集 Go 服务的 CPU、内存及 Goroutine 数量指标,并结合 Grafana 实现可视化告警:

// 暴露自定义指标
var (
    requestCount = prometheus.NewCounter(
        prometheus.CounterOpts{
            Name: "http_requests_total",
            Help: "Total number of HTTP requests.",
        },
    )
)
prometheus.MustRegister(requestCount)
数据库读写分离优化
随着数据量增长,单一主库已无法满足读请求压力。采用基于 MySQL 的主从复制架构,将读写流量分离。通过中间件如 Vitess 或应用层路由策略实现:
  • 写操作定向至主库,确保数据一致性
  • 非实时性读请求由从库处理,降低主库负载
  • 使用延迟阈值过滤滞后从库,避免脏读
边缘计算与 CDN 集成
针对静态资源访问延迟问题,将图片、JS/CSS 文件推送至 CDN 边缘节点。以下为 Nginx 配置示例,启用缓存控制头:

location ~* \.(js|css|png)$ {
    expires 1y;
    add_header Cache-Control "public, immutable";
    proxy_cache_bypass $http_upgrade;
}
优化项当前状态目标提升
API 响应 P99850ms<300ms
数据库连接池50动态扩缩容
LINQ核心技术解析与性能优化实战 LINQ(Language Integrated Query)是C#中的革命性数据查询技术,通过统一的语法实现多数据源操作。其核心原理是将命令式查询转换为声明式表达式树,在编译时进行类型检查并支持智能提示。技术价值体现在提升开发效率、减少代码量以及优化查询性能上,特别适用于数据库访问、集合处理和XML操作等场景。延迟执行和表达式树机制使LINQ能智能优化查询计划,而GroupBy、Join等操作符为复杂数据分析提供强大支持。在实际工程中,合理使用Include预加载、分页查询和参数化查询等技巧,能有效解决N 阅读详情

相关推荐

无需UMAT:基于Abaqus内置模型实现形状记忆聚合物结构的热-力耦合仿真

本文详细介绍了如何利用Abaqus内置模型实现形状记忆聚合物(SMP)的热-力耦合仿真,无需编写复杂的UMAT子程序。通过广义Maxwell模型和Neo-Hookean模型的组合应用,结合完整的热-力耦合分析流程,帮助工程师高效模拟SMP的形状记忆行为。文章还提供了工程应用案例和常见问题解决方案,为相关领域的研究和设计提供实用指导。

weixin_34005090的博客 117

揭秘EF Core索引设计陷阱:如何通过包含列大幅提升查询性能

掌握EF Core的索引优化秘诀,通过合理使用EF Core的索引包含列,覆盖查询字段减少回表,显著提升查询性能。适用于高频读取场景,结合IncludeProperties高效设计索引,值得收藏。

ProceNest的博客 998

未来智能家居解决方案:AI应用架构师的前沿探索

当你加班到深夜回家时,门锁自动识别你的脚步声解锁,玄关灯渐亮成你最爱的暖光,空调早已调到25℃(你夏天的习惯温度),音箱播放着最近循环的爵士乐,茶几上的智能水壶烧好了温水——这不是科幻电影,而是未来智能家居的日常。如何让“冰冷的设备”变成“懂你的伙伴”。我们将深入探讨五大前沿技术(边缘AI、多模态融合、联邦学习、数字孪生、个性化推荐)的底层原理,用“家里的小管家”“邻居互相学习”等生活化比喻简化复杂概念,结合代码示例与架构图还原实现流程,并通过智能卧室、智能厨房等真实案例展示落地路径。

AI天才研究院 1410

【EF Core索引优化终极指南】:揭秘包含列(Index Include)的5大应用场景与性能提升秘诀

掌握EF Core索引包含列优化技巧,提升查询性能50%以上。详解5大应用场景与Include列使用方法,覆盖覆盖索引、减少键查找等关键优势,有效加速数据检索。EF Core索引包含列实战指南,值得收藏。

SimProceed的博客 276

大疆2025八月份校招硬件工程师笔试真题A卷题目分享

大疆2025年笔试真题解析

weixin_63651698的博客 1569

【STM32/GD32】Keil uVision生成bin文件:从编译选项到Bootloader升级实战

本文详细讲解了如何在Keil uVision中配置STM32/GD32工程,使其在编译后自动生成Bootloader升级所需的bin文件。通过解析fromelf工具的使用、构建后命令的配置以及内存布局规划,深入阐述了bin文件在固件升级中的核心作用,并提供了串口Bootloader的实战框架与常见问题解决方案。

weixin_29190169的博客 392

EF Core高级索引技巧:包含列在复杂查询中的性能奇迹(案例实录)

掌握EF Core 的索引包含列技巧,显著提升复杂查询性能。适用于高并发读取场景,通过覆盖索引减少回表操作,大幅降低数据库负载。结合实际案例解析创建策略与优化效果,值得收藏。

FastDebug的博客 727

具身智能数据采集的工程化指南:从时间同步到质量校验

具身智能的模型训练离不开高质量的多模态轨迹数据,而数据采集并非简单的传感器记录。真实场景中,相机图像、机械臂关节状态与力觉信息必须在时间轴上精确对齐,标定的漂移和格式混乱会让看似正常的数据无法用于训练。时间同步与标定一致性,是决定数据质量的核心技术环节。在机器人抓取、操作等工程应用中,一套包含多传感器同步、轻量记录脚本、自动化质量校验与版本管理的数据采集流程,能大幅降低数据生产的失败率。本文从工程视角拆解具身数据采集中的典型问题,并给出可落地的流程设计与校验方法,帮助团队构建可持续迭代的高质量数据集。

weixin_30603633的博客 511

【EF Core高级性能优化】:掌握包含列技术,让查询效率飙升的7个实战案例

掌握EF Core索引包含列技巧,显著提升查询性能。本文详解7个实战场景,涵盖复合索引优化、覆盖查询实现与查询效率对比,帮助开发者精准设计数据库索引结构。理解包含列如何减少IO开销、避免回表查询,大幅提升应用响应速度,值得收藏。

VarFun的博客 452

Underactuated Robotics - 欠驱动机器人学(一)- 全驱动与欠驱动系统

根据牛顿的观点,机械系统的动力学是二阶的(其状态由位置向量 q(也称为配置向量)和速度向量以及(可能还有)时间给出。二阶控制动力系统的一般形式是:其中 u 是控制向量。定义 1.1 (欠驱动控制微分方程) 二阶控制微分方程描述如下:在状态和时间 t 中,如果所得到的映射是可射的:对于每一个,都存在一个能产生预期响应的,那么系统就是全驱动的。否则,就是欠驱动(状态在时间 t)。

机器人控制与仿真应用 3377

小程序跳转链接实战:https://wxaurl.cn/、weixin://dl/business/ 跳转与明文 URL Scheme 生成指南

本文聚焦小程序跳转链接开发核心技术,深入解析 https://wxaurl.cn/*TICKET* 与 weixin://dl/business/?t= *TICKET* 两种链接的生成方法。详细阐述生成前的准备工作、服务端接口调用步骤及注意事项,同时剖析 iOS 与 Android 系统在链接适配方面的差异。此外,针对明文 URL Scheme 获取,从平台设置、拼接规则、使用限制等方面展开讲解,并结合实际应用案例提出优化建议,帮助开发者快速掌握小程序跳转链接生成与明文URL Scheme获取的关键技术。

邓邓子的博客 2万+

高效数据库访问的秘密武器,EF Core索引深度优化完全指南

掌握高效数据库访问的关键,深入解析EF Core 的索引优化策略。涵盖索引创建、复合索引设计与查询性能提升技巧,适用于高并发、大数据量场景。显著提升数据检索速度,降低查询开销,EF Core 的索引是ORM性能调优的核心手段,值得收藏。

DeepNest的博客 608

【系统架构设计师】案例分析考点情况分析和解题技巧(包括2009~2024年考点详情)

复习方法建议仍然是以真题为主,只不过和综合题不同,标准答案并不会涵盖所有可能的考点。案例的考察方法和论文不太一样,它考察两大块的内容:

数据知道的博客 1万+

【高性能数据访问必修课】:EF Core包含列索引的5大应用场景

掌握EF Core索引包含列提升查询性能,本文详解5大典型应用场景与优化策略。涵盖复合索引设计、覆盖查询实现及数据过滤优化,助你精准加速数据库访问。方法实用,效果显著,值得收藏。

ByteGlow的博客 330

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

数据库性能卡顿?你可能忽略了EF Core索引的包含列功能,一文讲透正确用法

解决查询性能瓶颈?本文深入解析EF Core 索引包含列的正确用法,涵盖高频查询场景、减少回表操作的核心方法及性能提升关键优势,助你优化数据库访问效率。值得收藏,点击了解实战技巧。

CodeTrick的博客 302

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

EF Core计算列:使用数据库计算字段的现代方法

还在手动拼接字符串字段或在代码中计算派生值吗?EF Core的计算列功能让你直接在数据库层面实现字段计算,提升性能并保持数据一致性。本文将深入解析EF Core计算列的使用方法、最佳实践和高级场景。 ## 什么是计算列? 计算列(Computed Column)是数据库中的一种特殊列,其值由数据库根据其他列的值自动计算得出。EF Core通过`HasComputedColumnSql()`方法...

gitblog_00141的博客 1053

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【EF Core性能优化终极指南】:AsNoTrackingWithIdentityResolution的5大应用场景揭秘

掌握EF Core性能优化关键技巧,详解EF Core的AsNoTrackingWithIdentityResolution在只读查询、高并发场景、大数据量加载、避免跟踪开销和提升查询速度中的5大应用。显著降低内存消耗,提高应用响应效率,值得收藏。

InstrIsle的博客 905

EF Core中AsNoTrackingWithIdentityResolution的5大应用场景(资深架构师亲授)

掌握EF Core AsNoTrackingWithIdentityResolution的5大应用场景,提升查询性能与数据一致性。详解只读场景、高并发访问、缓存集成等关键用法,兼顾跟踪效率与实体去重,优化复杂查询性能,值得收藏。

CompiTide的博客 298

EF Core高效查询优化技巧

摘要:本文介绍Entity Framework Core性能优化策略,包括延迟查询执行、批量操作、原生SQL查询和日志配置。关键点:避免过早ToList()/ToArray()保持IQueryable;使用Include优化导航属性加载;AddRange/BulkInsert提升批量操作效率;原生SQL处理复杂查询;LogTo识别性能瓶颈;FluentAPI配置模型关系。还涉及分页处理、变更跟踪禁用和合理使用事务等技巧,适用于不同规模的EF Core应用场景,平衡性能与可维护性。(148字)

sjm_csdn的博客 1287

【EF Core时序索引深度解析】:掌握高性能时间序列数据查询的5大核心技巧

掌握EF Core 的时序索引,轻松实现高效时间序列查询。适用于日志分析、监控系统等高频写入场景,支持索引分区、时间范围查询优化、历史数据归档等技巧,显著提升查询性能与数据管理效率,值得收藏。

DebugLoom的博客 1004

【EF Core查询性能飞跃秘诀】:EFCache缓存机制深度解析与实战优化

提升EF Core查询性能?深入解析EF Core的查询缓存EFCache机制,涵盖高频查询场景、缓存命中优化与自动失效策略。通过配置拦截器与自定义依赖项实现高效缓存,显著降低数据库负载。性能跃升实战方案,值得收藏。

CompiWander的博客 1000

【高并发系统设计核心】:EF Core非跟踪查询的5大应用场景

掌握Entity Framework Core跟踪与非跟踪查询,提升高并发系统性能。本文详解非跟踪查询在只读场景、分页查询、缓存集成等5大应用中的优势,减少资源开销,提高响应速度。合理使用AsNoTracking提升查询效率,值得收藏。

LogicGlow的博客 649

【高阶开发者都在用】:EF Core ExecuteDelete批量删除的5大应用场景

高效解决EF Core批量删除性能瓶颈,本文详解ExecuteDelete方法在日志清理、关联数据维护等5大场景的应用。无需加载实体即可直接删除,显著提升效率。掌握核心用法与优势,值得收藏。

Algorhythm的博客 439

【Entity Framework Core索引配置秘籍】:掌握高效数据库查询的5大核心技巧

掌握Entity Framework Core 索引配置技巧,提升数据库查询性能。涵盖模型配置、唯一索引、复合索引等5大核心方法,适用于高并发场景下的数据优化。合理使用可显著减少查询耗时,提升应用响应速度,值得收藏。

BreakVein的博客 797

揭秘EF Core 9时序表功能:如何在几分钟内实现历史数据追踪

快速实现数据历史追踪,揭秘Entity Framework Core 9 的时序数据支持。通过启用时序表功能,轻松记录数据库变更,适用于审计日志、数据回滚等场景。配置简单,无需额外代码,自动管理历史快照。值得收藏

VarChat的博客 796

【EF Core 10向量搜索实战指南】:零基础集成Azure AI Search与PGVector,3步实现语义检索生产就绪

手把手教你用Entity Framework Core 10向量搜索扩展教程,3步集成Azure AI Search与PGVector。覆盖语义检索场景、EF Core 10原生向量查询、生产级配置与性能优化,开箱即用、强类型安全。值得收藏

StepNexus的博客 325
上一篇: 揭秘.NET MAUI页面传参黑科技:如何在复杂导航中稳定传递对象与回调?
下一篇: 为什么你的WinUI 3布局总是错乱?揭秘断点设置的4个隐藏陷阱
IterStream
博客等级 码龄1年 152粉丝 2112原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值