索引

Elasticsearch浅析

两盒软妹~` 提交于 2020-03-28 01:18:17
目录 Elasticsearch简介 基本概念 Elasticsearch特点 Elasticsearch节点类型 Elasticsearch集群状态 Elasticsearch集群选举 Elasticsearch写操作 Elasticsearch更新和删除操作 Elasticsearch读操作 Elasticsearch故障转移 Elasticsearch优化点 问题 Elasticsearch主要特性 参考文档 Elasticsearch简介 Elasticsearch是一个近实时的分布式搜索分析引擎,常被用作全文搜索,结构化搜索,分析等。它使用 Java 编写的且开源,它的内部使用 Lucene 做索引与搜索,但是它的目的是使全文检索变得简单,通过隐藏 Lucene 的复杂性,取而代之的提供一套简单一致的 RESTful API。 Lucene 是一个基于Java的全文信息检索工具库,它不是一个完整的搜索应用程序,而是为你的应用程序提供索引和搜索功能。Lucene 目前是Apache Jakarta家族中的一个开源项目。也是目前最为流行的基于 Java 开源全文检索工具库。 然而,Elasticsearch 不仅仅是 Lucene,并且也不仅仅只是一个全文搜索引擎。 它可以被下面这样准确的形容: 一个分布式的实时文档存储,每个字段可以被索引与搜索 一个分布式近实时分析搜索引擎

MySQL索引查询原理

烂漫一生 提交于 2020-03-28 00:02:14
什么是索引? “索引”是为了能够更快地查询数据。比如一本书的目录,就是这本书的内容的索引,读者可以通过在目录中快速查找自己想要的内容,然后根据页码去找到具体的章节。 数据库也是一样,如果查询语句使用到了索引,会先去索引里面查询,取得数据所在行的物理地址,进而访问数据。 索引的优缺点 优势:以快速检索,减少I/O次数,加快检索速度;根据索引分组和排序,可以加快分组和排序; 劣势:索引本身也是表,因此会占用存储空间。索引的维护和创建需要时间成本,这个成本随着数据量增大而增大;构建索引会降低数据表的修改操作(删除,添加,修改)的效率,因为在修改数据表的同时还需要修改索引表。 索引的分类 在MySQL中,常见的索引类型有:主键索引、唯一索引、普通索引、全文索引、组合索引。创建语法分别为: 其中,组合索引又称为多列索引,上述代码中最后一个例子就是建立了3列的索引。MySQL在根据索引查询时,会遵循“最左匹配”原则,即先根据col1的条件查,再根据col2的条件查,然后再根据col3的条件去查。 如果跳过了一个列直接查后面的列,比如下面的语句,就不能使用上面创建的索引了: 这里有一个小技巧,如果你前面的列是一个简单的枚举类型,比如性别等,可以用在where语句中加 col1 in(MALE, FEMALE) 来“跳过” col1 列,并使用上述索引。 对于某列如果是字符串且比较长(比如UUID

re模块语法—python正则表达式

被刻印的时光 ゝ 提交于 2020-03-27 21:00:05
用字符串匹配实现 对于简单的匹配查找,可以通过字符串匹配实现,比如:查找以”hello”开头的字符串 此时就可以正确查找出以start开始的字符串了 python中的正则表达式模块 在python中为我们提供了一个正则表达式模块,要使用该模块,必须手动引入该模块 Match对象是一次匹配的结果,包含了很多关于此次匹配的信息,可以使用Match提供的可读属性或方法来获取这些信息。 string: 匹配时使用的文本。 re: 匹配时使用的Pattern对象。 pos: 文本中正则表达式开始搜索的索引。值与Pattern.match()和Pattern.seach()方法的同名参数相同。 endpos: 文本中正则表达式结束搜索的索引。值与Pattern.match()和Pattern.seach()方法的同名参数相同。 lastindex: 最后一个被捕获的分组在文本中的索引。如果没有被捕获的分组,将为None。 lastgroup: 最后一个被捕获的分组的别名。如果这个分组没有别名或者没有被捕获的分组,将为None。 group([group1, …]): 获得一个或多个分组截获的字符串;指定多个参数时将以元组形式返回。group1可以使用编号也可以使用别名;编号0代表整个匹配的子串;不填写参数时,返回group(0);没有截获字符串的组返回None

数据库索引如何工作? [关闭]

谁说我不能喝 提交于 2020-03-27 19:00:58
3 月,跳不动了?>>> 问题: Given that indexing is so important as your data set increases in size, can someone explain how indexing works at a database-agnostic level? 鉴于索引在数据集大小增加时非常重要,有人可以解释索引在数据库无关的级别上的工作原理吗? For information on queries to index a field, check out How do I index a database column . 有关索引字段的查询的信息,请查看 如何索引数据库列 。 解决方案: 参考一: https://stackoom.com/question/Hs/数据库索引如何工作-关闭 参考二: https://oldbug.net/q/Hs/How-does-database-indexing-work-closed 来源: oschina 链接: https://my.oschina.net/u/3797416/blog/3212644

TiDB 4.0 新特性前瞻(三)再也不用担心我的 SQL 突然变慢了

微笑、不失礼 提交于 2020-03-27 16:17:13
3 月,跳不动了?>>> 关系型数据库的 DBA 日常肯定遇到过这样的一种场景: SQL 执行计划选择错误,这类问题的危害是很大的,常常导致业务突然卡顿,数据库过载等不良后果。 举个例子,假设我们有这么一张表: 其中,姓名和性别这两列有索引。我们设想一下,在这张表上,我们进行下面一条查询: SELECT * FROM t WHERE 姓名='小明' and 性别='男' 正常情况下,SQL 优化器内部会通过采样等手段,得到姓名和性别这两个索引的数据区分度,在这个场景下,大多数时候,「姓名」都是一个更有区分度的索引,所以优化器会选择姓名进行查询就能过滤掉大量的行。 但是,我们设想一个比较极端的情况,突然这个表中写入了大量的“女性小明”: 也就是会出现这样一种情况:对这条语句来说,使用「姓名」这个索引区分度变得不高,因为有大量的同名小明,但是「性别」这个索引却非常合适(只有一个男性小明)。 如果这个时候 SQL 优化器仍然选择了姓名的索引, 在业务中就会出现一条本来跑得好好的 SQL 突然变成了慢查询。 由于 TiDB 作为一个关系型数据库,而且优化器也是基于代价的优化器,通常基于代价的优化器对于数据的采样很难做到瞬时,尤其是数据量特别大表来说,总是有可能出现数据的分布随着业务的变化发生突变,即时采样做到实时,不仅仅是索引的选择,也包括 JOIN 方式的选择,JOIN 的顺序等

Java面试之MySQL

白昼怎懂夜的黑 提交于 2020-03-27 15:31:27
164. 数据库的三范式是什么? 第一范式:强调的是列的原子性,即数据库表的每一列都是不可分割的原子数据项。 第二范式:要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性。 第三范式:任何非主属性不依赖于其它非主属性。 表类型如果是 MyISAM ,那 id 就是 8。 表类型如果是 InnoDB,那 id 就是 6。 165. 一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 MySQL 数据库,又插入了一条数据,此时 id 是几? InnoDB 表只会把自增主键的最大 id 记录在内存中,所以重启之后会导致最大 id 丢失。 166. 如何获取当前数据库版本? 使用 select version() 获取当前 MySQL 数据库版本。 167. 说一下 ACID 是什么? Atomicity(原子性):一个事务(transaction)中的所有操作,或者全部完成,或者全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被恢复(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。即,事务不可分割、不可约简。 Consistency(一致性):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设约束、触发器、级联回滚等。 Isolation(隔离性)

mysql整理

时光怂恿深爱的人放手 提交于 2020-03-27 15:25:23
1.在 mysql 数据库内如何让自动增加字段从0开始 truncate table 表名 2.表中有A B C三列时,用SQL语句实现:当A列大于B列时选择A列,否则选择B列,当B列大于C列时选择B,否则选择C列 select case when A > B then A else B end, case when B > C then B else C end; 3. Redis Redis 是一个 key-value 存储系统。支持五种数据类型: (1) string (字符串) (2) list (列表) (3) hash ( hash 表) (4) set (集合) (5) zset (有序集合) 4. MyISAM 和 InnoDB 的区别 MyISAM 特点 (1)不支持事务、外键 (2)支持表级锁,不支持行级锁 (3)拥有较高的查询效率 InnoDB 特点 (1)支持事务、外键 (2)支持行级锁,并发性更高,需要的花销也更高 如果执行大量的 select , MyISAM 速度更快,如果执行大量的 insert 或 update , InnoDB 速度更快。执行 select count(*) from table 时, MyISAM 只是简单的读出保存好的行数,而 InnoDB 要扫描整个表来计算有多少行,如果执行 select count(*) from

MySQL引擎的和区别

狂风中的少年 提交于 2020-03-27 11:52:03
转载自 https://m.nowcoder.com/tutorial/93/8ac75a692a3b4b0a868796b9f008bc2c MySQL引擎 MySQL中的数据用各种不同的技术存储在文件(或内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧和锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或功能,从而改善你的应用的总体功能。 数据库引擎是用于存储、处理和保护数据的核心服务。利用数据库引擎可控制访问权限并快速处理事务,从而满足企业内大多数需要处理大量数据的应用程序的要求。 MySQL存储引擎主要有:MyISAM、InnoDB、Memory、Blackhole、CSV、Performance_Schema、Archieve、Federated、Mrg_Myiasm. 但是最常用的是InnoDB和MyISAM。 InnoDB InnoDB是一个事务型的存储引擎,有行级锁定和外键约束。 InnoDB引擎提供了对数据库ACID事务的支持,并且实现了SQL的四种隔离级别。 该引擎还提供了行级锁定和外键约束,它的设计目标是处理大容量数据库系统,它本身其实就是基于MySQL后台的完整数据库系统,MySQL运行时InnoDB会在内存中建立缓冲池,用于缓冲数据和索引。 但是该引擎不支持FULLTEXT类型的索引 而且它没有保存表的行数

MySQL 常见面试题

家住魔仙堡 提交于 2020-03-27 10:54:50
MySQL常见的两种存储引擎:MyISAM与InnoDB Mysql索引使用的数据结构主要有BTree索引 和 哈希索引 。对于哈希索引来说,底层的数据结构就是哈希表,因此在绝大多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;其余大部分场景,建议选择BTree索引。 Mysql的BTree索引使用的是B数中的B+Tree,但对于主要的两种存储引擎的实现方式是不同的。   MyISAM: B+Tree叶节点的data域存放的是数据记录的地址。在索引检索的时候,首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址读取相应的数据记录。这被称为“非聚簇索引”。   InnoDB: 其数据文件本身就是索引文件。相比MyISAM,索引文件和数据文件是分离的,其表数据文件本身就是按B+Tree组织的一个索引结构,树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。这被称为“聚簇索引(或聚集索引)”。而其余的索引都作为辅助索引,辅助索引的data域存储相应记录主键的值而不是地址,这也是和MyISAM不同的地方。在根据主索引搜索时,直接找到key所在的节点即可取出数据;在根据辅助索引查找时,则需要先取出主键的值,在走一遍主索引。 因此,在设计表的时候

列式存储数据库

二次信任 提交于 2020-03-27 09:02:56
关系型数据库系统以二维表的形式呈现数据,比如下面的员工表 RowId EmpId Lastname Firstname Salary 001 10 Smith Joe 40000 002 12 Jones Mary 50000 003 11 Johnson Cathy 44000 004 22 Jones Bob 55000 上面的格式仅仅存在于理论和逻辑中,事实上存储设备要求数据序列化为某种形式。 我们知道对于硬盘来说,最昂贵的操作是查找。为了提高最终性能,所需要的相关数据应该以某种方式去存储从而使“查找”操作尽可能少。硬盘由一系列规定大小的块(block)组成, 通常足以容纳数据表的几行。通过把相关的行存储在块中,仅仅一定数量的块需要被读取从而最小化了查找的数量。 行式存储 传统的存储方案是按行序列化数据,如下所示 001:10,Smith,Joe,40000;002:12,Jones,Mary,50000;003:11,Johnson,Cathy,44000;004:22,Jones,Bob,55000; 行式存储系统被设计为以很少的操作就可以返回整行或整条记录。当我们需要获取关于某个特定对象的信息的时候,比如某个用户的联系信息或某件商品信息,这种设计就相当适用。 但是行式存储不适用于对整个数据集的操作。比如,找出工资在40000到50000之间的记录