索引

深入理解全文索引

廉价感情. 提交于 2020-02-26 14:05:59
参考链接—— https://blog.csdn.net/weixin_33966095/article/details/89267494?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task 举一个例子,百度上你输入一个关键词,就需要检索出和这个关键词相关的文档。那么这就需要全文索引,当其数据库存储文档时,如果建立了全文索引的话,它就会对该文档进行分词处理,然后按关键词的重要程度进行排序,最后再建立一个倒排索引结构,通过这个关键词去索引和这个关键词相关联的文档id。 倒排索引中底层实现中用到的数据结构: https://blog.csdn.net/whichard/article/details/90753727?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task 来源: CSDN 作者: Kevin照墨 链接: https://blog.csdn.net/JustKian/article/details/104513612

Mysql索引选择逻辑

拟墨画扇 提交于 2020-02-26 12:53:30
有时候我们会发现mysql可能出现选错索引的情况,要了解这个问题我们得先看看sql优化器是怎么选择索引的 索引选择逻辑 优化器选择索引的目的,是找到一个最优的执行方案,并用最小的代价去执行语句。在数据库里面,扫描行数是影响执行代价的因素之一。扫描的行数越少,意味着访问磁盘数据的次数越少,消耗的 CPU 资源越少 扫描行数是怎么判断的? MySQL 在真正开始执行语句之前,并不能精确地知道满足这个条件的记录有多少条,而只能根据统计信息来估算记录数 这个统计信息就是索引的“区分度”。显然,一个索引上不同的值越多,这个索引的区分度就越好。而一个索引上不同的值的个数,我们称之为“基数”。也就是说,这个基数越大,索引的区分度越好 MySQL 是怎样得到索引的基数的呢 采样统计的时候,InnoDB 默认会选择 N 个数据页,统计这些页面上的不同值,得到一个平均值,然后乘以这个索引的页面数,就得到了这个索引的基数 而数据表是会持续更新的,索引统计信息也不会固定不变。所以,当变更的数据行数超过 1/M 的时候,会自动触发重新做一次索引统计 在 MySQL 中,有两种存储索引统计的方式,可以通过设置参数 innodb_stats_persistent 的值来选择: 设置为 on 的时候,表示统计信息会持久化存储。这时,默认的 N 是 20,M 是 10。 设置为 off 的时候

浅析MySQL中的Index Condition Pushdown (ICP 索引条件下推)和Multi-Range Read(MRR 索引多范围查找)查询优化

◇◆丶佛笑我妖孽 提交于 2020-02-26 06:51:41
本文出处: http://www.cnblogs.com/wy123/p/7374078.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错误进行修正或补充,无他) ICP优化原理 Index Condition Pushdown (ICP),也称为索引条件下推,体现在执行计划的上是会出现Using index condition(Extra列,当然Extra列的信息太多了,只能做简单分析) ICP原理通俗讲就是,查询过程中,直接在查询引擎层的API获取数据的时候实现"非直接索引"过滤条件的筛选,而不是查询引擎层查询出来之后在Server层筛选。 换句话说就是ICP在获取数据的同时实现了where的次选条件中无法直接使用索引的情况下的筛选,避免了没有ICP优化的时候分两个步骤的实现(获取数据的过程没有做次选条件的过滤) 如果是非ICP优化查询的话,是两步,第一步是获取数据,第二步是获取的数据进行条件筛选。 显然,相比后者,前者可以一步实现索引的查找Seek+filter,效率上更高。 适应的场景: ICP的优化策略可用于range、ref、eq_ref、ref_or_null 类型的访问数据方法 其实没有实例不太好理解这种优化策略,还是举两个实际列子吧。 ICP优化实例 第一个例子在网上非常多,也非常容易理解

Oracle主键约束、唯一键约束、唯一索引的区别

大憨熊 提交于 2020-02-26 06:36:33
一般,我们看到术语“索引”和“键”交换使用,但实际上这两个是不同的。索引是存储在数据库中的一个物理结构,键纯粹是一个逻辑概念。键代表创建来实施业务规则的完整性约束。索引和键的混淆通常是由于数据库使用索引来实施完整性约束。 接下来我们看看数据库中的主键约束、唯一键约束和唯一索引的区别。 SQL> select * from v$version; BANNER -------------------------------------------------------------------------------- Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production PL/SQL Release 11.2.0.1.0 - Production CORE 11.2.0.1.0 Production TNS for Linux: Version 11.2.0.1.0 - Production NLSRTL Version 11.2.0.1.0 - Production SQL> create table test ( 2 id int, 3 name varchar2(20), 4 constraint pk_test primary key(id)) 5 tablespace users;

mysql优化之索引篇

泪湿孤枕 提交于 2020-02-26 05:28:39
对mysql优化是一个综合性的技术,主要包括 a: 表的设计合理化(符合3NF) b: 添加适当索引(index) [四种: 普通索引、主键索引、唯一索引unique、全文索引] c: 分表技术(水平分割、垂直分割) d: 读写[写: update/delete/add]分离 e: 存储过程 [模块化编程,可以提高速度] f: 对mysql配置优化 [配置最大并发数my.ini, 调整缓存大小 ] g: mysql服务器硬件升级 h: 定时的去清除不需要的数据,定时进行碎片整理(MyISAM) i: sql语句优化 本篇主要总结下索引有关内容 索引 四种索引(主键索引/唯一索引/全文索引/普通索引) CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [USING index_type] ON tbl_name (index_col_name,...) index_col_name: col_name [(length)] [ASC | DESC] (列部分值作为索引) 列部分值作为索引:: 对于CHAR和VARCHAR列,只用一列的一部分就可创建索引。 创建索引时,使用col_name(length)语法,对前缀编制索引。 前缀包括每列值的前length个字符。 BLOB和TEXT列也可以编制索引,但是必须给出前缀长度。

python易错易忽略知识点

岁酱吖の 提交于 2020-02-26 02:52:04
文章目录 python基础知识 谈注释 谈数据类型 谈分支结构 谈random库的使用 谈组合数据类型 谈字符串类型 python基础知识 谈注释 1.在Python中将包含在一对三引号(’’’……’’’)或者("""……""")之间,并且不属于任何语句的内容认为是多注释。 谈数据类型 1.复数(complex) 2.repr() 返回一个对象的 string 格式。 3.布尔类型 bool()函数来测试数据对象、表达式是True还是False。 4.数据类型转换 int→整数型、float→浮点型、str→字符串型、hex→转化为十六进制字符串、oct→转化为八进制字符串 谈分支结构 1.**多分支结构:**if…elif…else 谈random库的使用 谈组合数据类型 1.列表 列表序列操作有:索引、切片、修改、追加、插入、删除、扩展、统计、排序(翻转)、获取下标、拷贝 a.索引 注意:通过索引取出的元素类型为 str b.切片 注意点 切片的索引界限可以利用谚语 “顾头不顾尾” 来记忆,也可以理解为数学中的左闭右开,数学式为: [a, b) 如果省略分隔符前面的索引值,如 list[:b] ,则表示为从第一个元素开始索引,数学式为: [0,b) ; 如果省略分隔符后面的索引值,如 list[a:] ,则表示为从a开始索引,索引到最后一个元素结束,此时表现为 “顾头又顾尾”

手札--mongo建索引

廉价感情. 提交于 2020-02-26 02:34:06
切记:数据库操作需谨慎,建议做好操作失败的操作,也能及时处理。 由于本次建立的索引,后台创建,并找到对应措施如:可以及时中断索引的创建 索引创建操作:以下操作在数千万条数据的表格实践过 1、查看集合是否有索引: db.getCollection("_TEMPLATE_TASK_TIME_HISTORY").getIndexes(); 2、索引总值大小: db.getCollection("_TEMPLATE_TASK_TIME_HISTORY").totalIndexSize() 3、删除索引(能放后台执行就在后台执行): db.getCollection("_TEMPLATE_TASK_TIME_HISTORY").dropIndex({"countTime":1},{background:true}) 4、创建索引(一定要在后台执行,否则锁库,原因是在建索引时大量的读写会把数据搞坏): db.getCollection("_TEMPLATE_TASK_TIME_HISTORY").dropIndex({"countTime":1},{background:true}) 5、查看索引创建进度: db.currentOp().inprog.forEach(function(op){ if(op.msg) print(op.msg) }) 如何中断正在创建的索引进度: https:/

架构师必备之常见面试题整理——数据库灵魂十问!

假如想象 提交于 2020-02-26 02:13:31
常见的数据库面试题有哪些 (一)什么是存储过程?有哪些优缺点? 存储过程是一些预编译的SQL语句。 更加直白的理解:存储过程可以说是一个记录集,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后再给这个代码块取一个名字,在用到这个功能的时候调用他就行了。 存储过程是一个预编译的代码块,执行效率比较高 一个存储过程替代大量T_SQL语句 ,可以降低网络通信量,提高通信速率 可以一定程度上确保数据安全 (二)索引是什么?有什么作用以及优缺点? 索引是对数据库表中一或多个列的值进行排序的结构,是帮助MySQL高效获取数据的数据结构 你也可以这样理解:索引就是加快检索表中数据的方法。数据库的索引类似于书籍的索引。在书籍中,索引允许用户不必翻阅完整个书就能迅速地找到所需要的信息。在数据库中,索引也允许数据库程序迅速地找到表中的数据,而不必扫描整个数据库。 MySQL 数据库几个基本的索引类型:普通索引、唯一索引、主键索引、全文索引 索引加快数据库的检索速度 索引降低了插入、删除、修改等维护任务的速度 唯一索引可以确保每一行数据的唯一性 通过使用索引,可以在查询的过程中使用优化隐藏器,提高系统的性能 索引需要占物理和数据空间 (三)什么是事务? 事务(Transaction)是并发控制的基本单位。所谓的事务,它是一个操作序列

从原理到优化,深入浅出数据库索引

爷,独闯天下 提交于 2020-02-26 02:08:32
MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。 数据库查询是数据库的最主要功能之一,我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化,这篇文章对索引做一个系统的梳理,希望对大家有帮助。 一、MySQL有哪些索引类型 索引的分类可以从多个角度进行,下面分别从数据结构,物理存储和业务逻辑三个维度进行划分。 1、从数据结构角度 (1)B+树索引(O(log(n))) 关于B+树索引,后面会深入解析 (2)hash索引 仅仅能满足"=","IN"和"<=>"查询,不能使用范围查询 其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引 只有Memory存储引擎显示支持hash索引 (3)FULLTEXT索引 现在MyISAM和InnoDB引擎都支持了 (4)R-Tree索引 用于对GIS数据类型创建SPATIAL索引 2、从物理存储角度 (1)聚集索引(clustered index) 正文内容按照一个特定维度排序存储,这个特定的维度就是聚集索引; Innodb存储引擎中行记录就是按照聚集索引维度顺序存储的,Innodb的表也称为索引表;因为行记录只能按照一个维度进行排序