数据库笔记-索引

DB-Day9笔记-用户权限&数据库备份&事务&索引&视图 帮助0基础的小伙伴入门和学习Mysql,感兴趣的小伙伴可以开始认真学习啦! 阅读详情

索引

索引是帮助 MySQL 高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查询算法,这种数据结构就是索引。

优缺点:

优点:

  • 提高数据检索效率,降低数据库的IO成本
  • 通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消耗

缺点:

  • 索引列也是要占用空间的
  • 索引大大提高了查询效率,但降低了更新的速度,比如 INSERT、UPDATE、DELETE (树的结果需要发生调整,变化,需要进行重新的排序)

索引结构

索引结构描述
B+Tree最常见的索引类型,大部分引擎都支持B+树索引
Hash底层数据结构是用哈希表实现,只有精确匹配索引列的查询才有效,不支持范围查询
R-Tree(空间索引)空间索引是 MyISAM 引擎的一个特殊索引类型,主要用于地理空间数据类型,通常使用较少
Full-Text(全文索引)是一种通过建立倒排索引,快速匹配文档的方式,类似于 Lucene, Solr, ES

索引InnoDBMyISAMMemory
B+Tree索引支持支持支持
Hash索引不支持不支持支持
R-Tree索引不支持支持不支持
Full-text5.6版本后支持支持不支持

树类索引结构的比较(二叉树、红黑树、b树、b+树)

二叉树 

(极端情况下,可能出现单向链表的形式出现,这样会导致查询的时间复杂度 降低到 O(n))

一个层级 只能够包含两个结点(容纳太少)导致树高过高(IO 成本大幅度提高)

        需要解决问题:      

  1.  需要降低树高 —— 解决办法(使用红黑树进行解决 (红黑树实现自平衡)) 动态调整
  2. 结点的容纳数 (虽然使用红黑树,能够避免出现链表的形式,但是还是存在着结点数过少)

(红黑树的本质:任然是二叉树) (多路平衡二叉树) 

B- Tree(多路平衡数)

        以一棵最大度数(max-degree,指一个节点的子节点个数)为5(5阶)的 b-tree 为例(每个节点最多存储4个key,5个指针)

B+Tree (b+树的变种 :)

结构图: 

区别

  • 所有的数据都会出现在叶子节点 ,非叶子结点:存放索引的指针
  • 叶子节点形成一个双向链表 (循环链表)mysql对b+树进行优化  
    • 目的是为了支持范围查找 
    • 叶子结点是有顺序的排序

MySQL 索引数据结构对经典的 B+Tree 进行了优化。在原 B+Tree 的基础上,增加一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的 B+Tree,提高区间访问的性能。

Hash索引

哈希索引就是采用一定的hash算法,将键值换算成新的hash值,映射到对应的槽位上,然后存储在hash表中。
如果两个(或多个)键值,映射到一个相同的槽位上,他们就产生了hash冲突(也称为hash碰撞),可以通过链表来解决。

  • Hash索引只能用于对等比较(=、in),不支持范围查询(betwwn、>、<、…)
  • 无法利用索引完成排序操作
  • 查询效率高,通常只需要一次检索就可以了,效率通常要高于 B+Tree 索引
    • 出现hash碰撞后,则需要去进行判断(具体方法:开放地址法、再hash法)
  • Memory(hash 索引只使用与menory)
  • InnoDB: 具有自适应hash功能,hash索引是存储引擎根据 B+Tree 索引在指定条件下自动构建的

面试题

  1. 为什么 InnoDB 存储引擎选择使用 B+Tree 索引结构?
  • 相对于二叉树,层级更少,搜索效率高 (IO 效率 每多一层,就需要的翻页)
  • 对于 B-Tree,无论是叶子节点还是非叶子节点,都会保存数据,这样导致一页中存储的键值减少,指针也跟着减少,要同样保存大量数据,只能增加树的高度,导致性能降低】
    • 存储的页数的大小
  • 相对于 Hash 索引,B+Tree 支持范围匹配及排序操作

索引分类

分类含义特点关键字
主键索引针对于表中主键创建的索引默认自动创建,只能有一个PRIMARY
唯一索引避免同一个表中某数据列中的值重复可以有多个UNIQUE
常规索引快速定位特定数据可以有多个
全文索引全文索引查找的是文本中的关键词,而不是比较索引中的值可以有多个FULLTEXT

        可以拥有多个是指 对于字段的类型可以选择多个不同的字段,而主键索引,选择完 一个字段后,就不可以去选择其他的类型

在 InnoDB 存储引擎中,根据索引的存储形式,又可以分为以下两种:

分类含义特点
聚集(簇)索引(Clustered Index)将数据存储与索引放一块,索引结构的叶子节点(date)保存了行数据必须有,而且只有一个

二级索引(Secondary Index)

非聚簇索引

将数据与索引分开存储,索引结构的叶子节点(date)关联的是对应的主键可以存在多个

聚簇索引的选取规则

  1. 若存在主键索引,则主键索引就是聚簇索引
  2. 若不存在主键,则使用第一个唯一的唯一索引作为聚簇索引

回表操作

        

索引

语法

创建索引:
CREATE [ UNIQUE | FULLTEXT ] INDEX index_name ON table_name (index_col_name, ...);
如果不加 CREATE 后面不加索引类型参数,则创建的是常规索引  全文suo

查看索引:
SHOW INDEX FROM table_name;

删除索引:
DROP INDEX index_name ON table_name;

查询表中已经存在的索引字段

        show  index from 表名 

创建联合索引的时候,需要注意相应的字段的顺序(最左前缀匹配原则)

删除索引

        drop index  索引名称 

SQL 性能分析

        首先进行sql 进行查询,优化查询语句

慢查询日志

(默认是没有开启的,需要进行手动开启) 

开启慢查询: 判断配置参数中的信息

        show_query_log = 1. 开启 慢查询日志 (默认是设置为 0)

        long_qyery_time = 2 设置慢查询日志的最长执行时间。若超过这个时间,则表示是慢sql语句 

         

查看是否有开启日志:show variable like 'slow_query_log' 

expire 进行想要的查看具体的执行细则

解释

EXPLAIN 或者 DESC 命令获取 MySQL 如何执行 SELECT 语句的信息,包括在 SELECT 语句执行过程中表如何连接和连接的顺序。
语法:

  1. # 直接在select语句之前加上关键字 explain / desc
  2. EXPLAIN SELECT 字段列表 FROM 表名 HWERE 条件;

​​​​​​​

EXPLAIN 各字段含义:

  • id:select 查询的序列号,表示查询中执行 select 子句或者操作表的顺序(id相同,执行顺序从上到下;id不同,值越大越先执行)
  • select_type:表示 SELECT 的类型,常见取值有 SIMPLE(简单表,即不适用表连接或者子查询)、PRIMARY(主查询,即外层的查询)、UNION(UNION中的第二个或者后面的查询语句)、SUBQUERY(SELECT/WHERE之后包含了子查询)等
  • type:表示连接类型,性能由好到差的连接类型为 NULL、system、const、eq_ref、ref、range、index、all
  • possible_key:可能应用在这张表上的索引,一个或多个
  • Key:实际使用的索引,如果为 NULL,则没有使用索引
  • Key_len:表示索引中使用的字节数,该值为索引字段最大可能长度,并非实际使用长度,在不损失精确性的前提下,长度越短越好
  • rows:MySQL认为必须要执行的行数,在InnoDB引擎的表中,是一个估计值,可能并不总是准确的
  • filtered:表示返回结果的行数占需读取行数的百分比,filtered的值越大越好

索引使用的具体规则

 

使用规则

        最左前缀法则

如果索引关联了多列(联合索引),要遵守最左前缀法则,最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列。
如果跳跃某一列,索引将部分失效(后面的字段索引失效)。

联合索引中,出现范围查询(<, >),范围查询右侧的列索引失效。可以用>=或者<=来规避索引失效问题。

索引失效情况

  1. 在索引列上进行运算操作,索引将失效。
    1. 如:explain select * from tb_user where substring(phone, 10, 2) = '15';
  2. 字符串类型字段使用时,不加引号,索引将失效。如:,此处phone的值没有加引号
    1. explain select * from tb_user where phone = 17799990015;
  3. 模糊查询中,如果仅仅是尾部模糊匹配,索引不会是失效;如果是头部模糊匹配,索引失效。如:,前后都有 % 也会失效。
    1. explain select * from tb_user where profession like '%工程';
    2. explain select * from tb_user where profession like '软件%';(不会失效)
    3. explain select * from tb_user where profession like '%科学%';(失效)
  4. 用或 分割开的条件,如果 or 其中一个条件的列没有索引,那么涉及的索引都不会被用到。只有两侧都有索引,才有效。

如果 MySQL 评估使用索引比全表更慢,则不使用索引。(SQL的自优化(优化器))

SQL 提示

是优化数据库的一个重要手段,简单来说,就是在SQL语句中加入一些人为的提示来达到优化操作的目的。(加入人为的提示,让SQL出现多种选择的情况时,能够走相应的人为的命令)

例如,使用索引:user index (index_name)

不使用哪个索引:ignore index(index_name)

必须使用哪个索引:explain select * from tb_user use index(idx_user_pro) where profession="软件工程";explain select * from tb_user ignore index(idx_user_pro) where profession="软件工程";
explain select * from tb_user force index(idx_user_pro) where profession="软件工程";

use 是建议,实际使用哪个索引 MySQL 还会自己权衡运行速度去更改。(建议不一定执行)

force就是无论如何都强制使用该索引。(强制命令的使用)

覆盖索引&回表查询

尽量使用覆盖索引(查询使用了索引,并且需要返回的列,在该索引中已经全部能找到),减少 select *。

explain 中 extra 字段含义:
:查找使用了索引,但是需要回表查询数据
:查找使用了索引,但是需要的数据都在索引列中能找到,所以不需要回表查询using index conditionusing where; using index;

如果在聚集索引中直接能找到对应的行,则直接返回行数据,只需要一次查询,哪怕是select *;如果在辅助索引中找聚集索引,如,也只需要通过辅助索引(name)查找到对应的id,返回name和name索引对应的id即可,只需要一次查询;如果是通过辅助索引查找其他字段,则需要回表查询,如select id, name from xxx where name='xxx';select id, name, gender from xxx where name='xxx';

所以尽量不要用,容易出现回表查询,降低效率,除非有联合索引包含了所有字段select *

面试题:一张表,有四个字段(id, username, password, status),由于数据量大,需要对以下SQL语句进行优化,该如何进行才是最优方案:
select id, username, password from tb_user where username='itcast';

解:给用户名和password字段建立联合索引,则不需要回表查询,直接覆盖索引 联合索引的date域中存储的是唯一索引(主键) ,因此可以直接使用上。从而达到覆盖索引的作用

前缀索引

当字段类型为字符串(varchar, text等)时,有时候需要索引很长的字符串,这会让索引变得很大,查询时,浪费大量的磁盘IO,影响查询效率,此时可以只降字符串的一部分前缀,建立索引,这样可以大大节约索引空间,从而提高索引效率。

语法:
前缀长度:可以根据索引的选择性来决定,而选择性是指不重复的索引值(基数)和数据表的记录总数的比值,索引选择性越高则查询效率越高,唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的。
求选择性公式:create index idx_xxxx on table_name(columnn(n));

与建立一般的索引的区别是:在后面是字段名称加上(n) 表示提取字段的前n个字段进行构建索引

  1. select count(distinct email) / count(*) from tb_user;
  2. select count(distinct substring(email, 1, 5)) / count(*) from tb_user;

show index 里面的sub_part可以看到接取的长度

单列索引-联合索引

单列索引:即一个索引只包含单个列
联合索引:即一个索引包含了多个列
在业务场景中,如果存在多个查询条件,考虑针对于查询字段建立索引时,建议建立联合索引,而非单列索引。

单列索引情况:

这句只会用到phone索引字段explain select id, phone, name from tb_user where phone = '17799990010' and name = '韩信';

注意事项

  • 多条件联合查询时,MySQL优化器会评估哪个字段的索引效率更高,会选择该索引完成本次查询

索引的设计原则

设计原则

  1. 针对于数据量较大(百万级别、千万级别),且查询(query)比较频繁的表建立索引
  2. 针对于常作为查询条件(where)、排序(order by)、分组(group by)操作的字段建立索引 (字段后都会建立索引、使用索引)
  3. 尽量选择区分度高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率越高
  4. 如果是字符串类型的字段,字段长度较长,可以针对于字段的特点,建立前缀索引(注意前缀的区分度)
  5. 尽量使用联合索引,减少单列索引,查询时,联合索引很多时候可以覆盖索引,节省存储空间,避免回表,提高查询效率
  6. 要控制索引的数量,索引并不是多多益善,索引越多,维护索引结构的代价就越大,会影响增删改的效率(索引修改会导致树的结点的调整,影响性能。并且索引本身也会占据一定的空间)
  7. 如果索引列不能存储NULL值,请在创建表时使用NOT NULL约束它。当优化器知道每列是否包含NULL值时,它可以更好地确定哪个索引最有效地用于查询 (使用not null 方便SQL优化器进行优化判断)

openGauss学习笔记-295 openGauss AI特性-AI4DB数据库自治运维-DBMind的AI子功能-Index-advisor:索引推荐-虚拟索引 虚拟索引功能支持用户在数据库中直接进行操作,本功能将模拟真实索引的建立,避免真实索引创建所需的时间和空间开销,用户基于虚拟索引,可通过优化器评估该索引对指定查询语句的代价影响。 阅读详情

相关推荐

openGauss学习笔记-296 openGauss AI特性-AI4DB数据库自治运维-DBMind的AI子功能-Index-advisor:索引推荐-workload级别索引推荐

对于workload级别的索引推荐,用户可通过运行数据库外的脚本使用此功能,本功能将包含有多条DML语句的workload作为输入,最终生成一批可对整体workload的执行表现进行优化的索引。同时,本功能提供从日志中或系统表中抽取业务数据SQL流水的功能。

超哥的博客 228

数据库学习笔记一:索引篇

从数据页的角度看 B+ 树 | 小林coding从数据页的角度看 B+ 树 | 小林coding学习资料来源,侵权删除: 从数据页的角度看 B+ 树 | 小林coding 一、索引篇 InnoDB 是如何存储数据的? 记录是按照行来存储的,但是数据库的读取并不以「行」为单位,否则一次读取(一次 I/O 操作)只能处理一行数据,效率会非常低。 因此,InnoDB 的数据是按「数据页」为单位来读写的,也就是说,当需要读一条记录的时候,并不是将这个记录本身从磁盘读出来,而是以页为单位整体读入

上山的人 2476

openGauss学习笔记-294 openGauss AI特性-AI4DB数据库自治运维-DBMind的AI子功能-Index-advisor:索引推荐-单query索引推荐

openGauss学习笔记-294 openGauss AI特性-AI4DB数据库自治运维-DBMind的AI子功能-Index-advisor:索引推荐-单query索引推荐

超哥的博客 192

MySQL进阶-索引(二)

MySQL进阶-索引,索引语法,索引性能分析,索引查看执行频次,慢查询日志,show profiles,explain,验证索引效率,最左前缀法则

Romised的博客 716

计算机组成与系统结构(第三版) 袁春风主编 课后习题答案讲解 第一、二章 计算机系统概述 数据的机器级表示

计算机组成与系统结构(第三版) 袁春风主编 课后习题答案讲解 第一、二章 计算机系统概述 数据的机器级表示

qq_73523062的博客 2092

CATIA二次开发CAA:(一)开发环境搭建

CATIA+CAA+RADE+VS2012

ysm1987的博客 1万+

【MySQL 面试系列】索引原理

Mysql进阶、索引原理、面试准备

csdn_CZQ的博客 1117

智能优化电池:基于单片机的电池管理系统

设计简介: 本设计是基于单片机的电池管理系统,主要实现以下功能: 可通过LCD1602显示温度、电压电流值; 可通过按键调整温度、电压和电流的阈值; 用ADC0832将模拟量转换为数字量。 标签:51单片机、LCD1602、ADC0832 效果图: 总体资料: 原理图: 软件设计流程: 系统框图: 本设计以STC89C52单片机为核心控制器,加上其他的模块一起组成电动汽车的电池管理的整个系统,...

专注单片机实战教学,分享单片机学习资料 375

mysql code name作为字段_MySQL索引管理及执行计划

一.索引介绍1.什么是索引1)索引就好比一本书的目录,它能让你更快的找到自己想要的内容。2)让获取的数据更有目的性,从而提高数据库检索数据的性能。2.索引类型介绍1)BTREE:B+树索引2)HASH:HASH索引3)FULLTEXT:全文索引4)RTREE:R树索引图1·B+tree索引图2·B*tree索引3.索引管理索引建立在表的列上(字段)的。在where后面的列建立索引才会加快查询...

weixin_29111593的博客 408

Duilib的简单使用(五、DuiDesigner/DuiEditor的下载编译)

一、前言 在Duilib的简单使用(一、duilib demo)中我们介绍了利用duilib简单的构造一个项目 在Duilib的简单使用(二、xml实现界面与业务分离)中我们介绍了XML在duilib中的使用 在Duilib的简单使用(三、界面逻辑交互)中我们已经知道如何简单的进行界面的交互 在Duilib的简单使用(四、换肤)中,我们提了一下Duilib强大的一键换肤功能。 通过之前的说明,我们知道duilib是通过xml来分离界面和业务逻辑的,但是xml如果不能预览,那每次敲一个再运行一下看看效果,这不

LyRics1996的博客 2889

AD域控设置客户端桌面壁纸

此时再右键wallpaper文件夹,共享选项下的网络路径已经有了。找到该域下的组策略编辑器(第一步有)并按照图下所示找到桌面壁纸的策略设置,点击进去。在高级共享里可以设置共享名和同时共享的用户数量限制。点击下拉箭头,找到Everyone并选择,点击添加后,点击共享。然后可以看到刚才的新建文件夹策略在域控服务器和客户端都生效了。右键wallpaper文件夹->属性,点击共享选项,点击共享。在弹出的窗口里,按照图下所示设置,点击应用并且确认。在弹出的窗口里,按图示找到文件夹,右键新建文件夹。

欲买桂花同载酒的博客 6054

看完就知道什么是数据库索引

一、索引是什么 索引是在表的列上创建。索引是一种数据结构--索引包含一个表中列的值,并且这些值存储在一个数据结构中。 二、索引分类 聚集索引(主键索引):在数据库里面,所有行数都会按照主键索引进行排序。 非聚集索引:给普通字段加上索引。 联合索引:好几个字段组成的复合索引。联合索引使用原则:最左原则,有A、B、C三个字段建立的联合索引,如果A字段在查询时为空,那么这个联合索引不生效;如果A字段不为空,B、C不管为不为空,那么联合索引都是生效的。 三、为什么要...

zheng2780071070的博客 867

PCB Layout工程师核心能力与实战进阶指南

PCB Layout是电子硬件从原理图到物理实现的关键环节,本质是将电路逻辑转化为受电磁场、热力学与制造工艺约束的三维空间结构。其设计质量直接决定信号完整性(SI)、电源完整性(PI)和电磁兼容性(EMC)等核心性能指标。随着高速接口(如PCIe Gen5、USB3.2)、高密度封装(BGA微间距、HDI)及车规/工业级可靠性要求提升,Layout已从‘连线’演进为多目标协同优化的系统工程。掌握Altium Designer等EDA工具、理解叠层设计与DFM规则、具备SI/PI仿真意识,并能贯通芯片Data

weixin_42589700的博客 87

笔记-数据库索引

b树是一种平衡查找树,几阶就代表了b树中每个节点最多能有几个子节点,比如m阶就最多就有m个节点,每个节点最多只能有m-1个键,最少要有Math.ceil(m/2)-1个键(Math.ceil向上取整),每个节点的左子节点小于这个节点,这个节点的右子节点大于这个节点。b树每个节点都包含键和值。

weixin_43063631的博客 613

一文掌握DrissionPage的详细使用

是一个基于 Python 的网页自动化工具,主要用于网页数据的抓取、自动化操作和测试。它结合了 Selenium 和 Requests 的优点,提供了更简洁、高效的 API,适用于各种网页自动化任务。DrissionPage 是一个功能强大且易于使用的网页自动化工具,适用于各种网页自动化任务。希望本文的 DrissionPage 的基本使用方法和一些高级功能能够帮助到你。

数据知道的博客 1万+

从 SOAUTH2 到系统用户,SAP AS ABAP 里配置 OAuth 2.0 Client 的完整落地思路

SAP OAuth 2.0客户端配置的核心在于建立系统级信任关系。在AS ABAP中,每个OAuth 2.0客户端必须关联一个System类型的用户账号(通过SU01创建),并建议采用业务语义明确的命名规范(如ZBTP_PO_APPROVAL_APP)。关键配置包括:客户端认证方式(推荐SSL证书而非共享密钥)、Token生命周期(默认3600秒)、Scope访问范围,以及根据应用场景选择Authorization Code或SAML 2.0 Bearer等授权模式。项目实践中应避免混合配置不同授权类型,而

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 988

数据库索引个人笔记

索引 Mysql的索引比如一本书的目录,它能让你更快找到你想要的内容。索引并不是越多越好,建立索引需要耗费磁盘空间,同时在对索引的维护上会消耗数据库的性能,对于查找频率高并且数据库数据量大的数据建立索引能够提高查找的性能。 索引的结构 索引主要有两种结构,分别是B+TREE索引和HASH索引。 B+TREE B+TREE是MySql使用最多的一种索引结构。 是Innodb和Myisam...

programmer_v的博客 503

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【力扣数据库知识手册笔记】索引

索引开始的几个字符,而不是索引全部值,避免因为需要索引很长的字符列使得索引变大变慢,这种索引被称为前缀索引,以节约空间并得到好的性能。建立前缀索引的前提:前缀的辨识度高(如密码)。前缀索引需要的空间变小,但也会降低选择性(不重复的索引值/表中所有行数T,范围为1/T~1)。高选择性的索引在查找匹配的时候可以过滤掉更多的行,唯一索引的选择率为1,为最佳值。在MySQL建立联合索引(多列索引)时会遵守最左前缀匹配原则,即最左优先,在检索数据时从联合索引的最左边开始匹配。

m0_48165967的博客 762

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

深度学习工具包 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")

Java笔记19.4SQL数据库 索引

qq_45689826的博客 128

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

数据库索引学习笔记

索引(Index)是一种独立于数据本身的、用于加快数据检索速度的数据结构。它由数据库表的一列或多列组合构成,并通过一种高效的数据结构(如B+树)进行组织。

weixin_52528537的博客 1979

数据库索引创建与使用详细笔记

索引是数据库中的高效查询结构,常见类型包括B-Tree索引。不同数据类型对应不同索引应用:字符串(VARCHAR)适合前缀索引和模糊查询;整数(INT)适用于等值和范围查询;浮点数(FLOAT)常用于数值范围筛选;日期(DATE)支持时间区间检索;布尔(BOOLEAN)和枚举(ENUM)适合等值查询,而二进制(BLOB)通常不建索引。每种索引类型均有对应的SQL创建语句和典型查询示例,合理使用可显著提升数据库性能。

笑衬人心的博客 688

数据库索引笔记

索引使用介绍--- 执行计划分析查看执行计划格式:explain/desc + SQLmysql>执行计划详解索引使用介绍---

caoyanzhi的博客 663

【笔记】数据库索引用法

数据库索引用法索引类型索引使用索引命中 索引类型 普通索引,唯一索引(唯一索引要求字段中不会出现重复数据),复合索引(将多个字段组合起来作为索引,必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用。)。 索引使用 建立索引: create index 索引名 on 表名(索引字段名) 建立唯一索引: create unique index 索引名 on 表名(索引字段名) 建立复合索引: create index 索引名 on 表名(索引字段名1,索引字段名2..

charlesfromcn的博客 276

数据库笔记——分析总结聚集索引、非聚集索引和覆盖索引

然而, 事物都是有两面的, 索引能让数据库查询数据的速度上升, 而使写入数据的速度下降,原因很简单的, 因为平衡树这个结构必须一直维持在一个正确的状态, 增删改数据都会改变平衡树各节点中的索引数据内容,破坏树结构, 因此,在每次数据改变时, DBMS必须去重新梳理树(索引)的结构以确保它的正确,这会带来不小的性能开销,也就是为什么索引会给查询以外的操作带来副作用的原因。当然, 有的数据库也使用哈希桶作用索引的数据结构 , 然而, 主流的RDBMS(关系型数据库)都是把平衡树当做数据表默认的索引数据结构的。

weixin_52010459的博客 1194

Postgre 数据库索引笔记

1.使用索引的优点 通过创建唯一索引,可以保证数据唯一性 提高数据记录的查询速度 加快表与表之间的连接速度 2.使用索引的缺点 使用索引具有以下缺点 需要占据额外的物理存储空间 如果表中数据有变化,则索引也需要同步更新,对数据库性能有一定影响 3.索引分类 pgsql中提供了B-tree,hash,GiST,SP-GIST,GIN,BRIN 等多种索引类型,每种索引使用不同的算法来适应不同类型的查询。在默认情况下,创建的索引类型为B-tree索引。 b-tree索引 b-tree索引使

qq_39276701的博客 1265

MySQL数据库学习笔记 --- 索引

本文系B站《黑马程序员 MySQL数据库入门到精通》课程学习笔记,视频课网址:https://www.bilibili.com/video/BV1Kr4y1i7ru?spm_id_from=333.788.player.switch&vd_source=23c0566fd2a5745f9a55b8adfc460734&p=27

2301_77574443的博客 1143
上一篇: 算法日记:739 每日温度
下一篇: 数据库笔记- 锁部分
二代熊猫超人
博客等级 码龄6年 3粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值