精华内容
下载资源
问答
  • 创建TCP客户端Client client = new TransportClient().addTransportAddress(new InetSocketTransportAddress("localhost", 9300));创建索引client.admin().indices().prepareCreate("pages")....创建索引结构XCo...

    创建TCP客户端

    Client client = new TransportClient()

    .addTransportAddress(new InetSocketTransportAddress(

    "localhost", 9300));

    创建索引

    client.admin().indices().prepareCreate("pages").execute().actionGet();

    创建索引结构

    XContentBuilder builder=XContentFactory

    .jsonBuilder()

    .startObject()

    .startObject("sina")

    .startObject("properties")

    .startObject("article_title")

    .field("type", "string")

    .field("store", "yes")

    .field("analyzer","ik")

    .field("index","analyzed")

    .endObject()

    .startObject("article_content")

    .field("type", "string")

    .field("store", "no")

    .field("analyzer","ik")

    .field("index","analyzed")

    .endObject()

    .startObject("article_url")

    .field("type", "string")

    .field("store", "yes")

    .field("index","not_analyzed")

    .endObject()

    .endObject()

    .endObject()

    .endObject();

    PutMappingRequest mapping = Requests.putMappingRequest("pages").type("sina").source(builder);

    client.admin().indices().putMapping(mapping).actionGet();

    添加索引数据

    IndexResponse response = client.prepareIndex("pages", "sina", null)

    .setSource(jsonBuilder()

    .startObject()

    .field("article_title", Bytes.toString(r.getValue("article".getBytes(), "title".getBytes())))

    .field("article_content", Bytes.toString(r.getValue("article".getBytes(), "content".getBytes())))

    .field("article_url", Bytes.toString(r.getValue("article".getBytes(), "url".getBytes())))

    .endObject()

    )

    .execute()

    .actionGet();

    client.close();

    展开全文
  • 前言这篇文章详细介绍了如何创建索引和某个类型的映射。下文中[address]指代elasticsearch服务器访问地址(http://localhost:9200)。1 创建索引1.1 简单创建语句curl -XPUT [address]/blog1.2 带参数的创建语句curl -...

    前言

    这篇文章详细介绍了如何创建索引和某个类型的映射。

    下文中[address]指代elasticsearch服务器访问地址(http://localhost:9200)。

    1       创建索引

    1.1     简单创建语句

    curl -XPUT [address]/blog

    1.2     带参数的创建语句

    curl -XPUT [address]/blog/ -d '{

    "settings":{

    "number_of_shards":1,     //设置分片数量

    "number_of_replicas":2,  //设置副本数量

    //自定义索引默认分析器

    "index":{

    "analysis":{

    "analyzer":{

    "default":{

    "tokenizer":"standard",     //分词器

    "filter":[ //过滤器

    "asciifolding",

    "lowercase",

    "ourEnglishFilter"

    ]

    }

    },

    "filter":{

    "ourEnglishFilter":{

    "type":"kstem"

    }

    }

    }

    }

    }

    }'

    2       创建映射(扁平结构)

    2.1     简单创建语句

    curl -XPUT [address]/blog/_mapping/article?pretty -d '{

    "properties":{

    "id":{"type":"long"},

    "name":{"type":"string"},

    "published":{"type":"date"}

    }

    }'

    2.2     带参数的创建语句

    curl -XPUT [address]/blog/_mapping/article?pretty -d '{

    "dynamic":"false",  //关闭自动添加字段,关闭后索引数据中如果有多余字段不会修改mapping,默认true

    "_id":{"index":"not_analyzed","store":"no"},        //设置文档标识符可以被索引,默认不能被索引。可以设置为"_id":{"path":"book_id"},这样将使用字段book_id作为标识符

    "_all":{"enabled":"false"},       //禁用_all字段,_all字段包含了索引中所有其他字段的所有数据,便于搜索。默认启用

    "_source":{"enabled":"false"},        //禁用_source字段,_source字段在生成索引过程中存储发送到elasticsearch的原始json文档。elasticsearch部分功能依赖此字段(如局部更新功能),因此建议开启。默认启用

    "_index":{"enabled":"true"},  //启用_index字段,index字段返回文档所在的索引名称。默认关闭。

    "_timestamp":{"enabled":"true","index":"not_analyzed","store":"true","format":"YYYY-mm-dd"},                  //启用时间戳并设置。时间戳记录文档索引时间,使用局部文档更新功能时,时间戳也会被更新。默认未经分析编入索引但不保存。

    "_ttl":{"enabled":"true","default":"30d"},     //定义文档的生命周期,周期结束后文档会自动删除。

    "_routing":{"required":"true","path":"name"}      //指定将name字段作为路由,且每个文档必须指定name字段。

    "properties":{

    "id":{

    "type":"long",

    //公共属性

    "store":"yes",

    //数值特有属性

    "precision_step":"0"       //指定为该字段生成的词条数,值越低,产生的词条数越多,查询会更快,但索引会更大。默认4

    },

    "name":{

    "type":"string",

    //公共属性

    "store":"yes",

    "index":"not_analyzed", //analyzed:编入索引供搜索、no:不编入索引、not_analyzed(string专有):不经分析编入索引

    "boost":"1",    //文档中该字段的重要性,值越大表示越重要,默认1

    "null_value":"jim",  //当索引文档的此字段为空时填充的默认值,默认忽略该字段

    "include_in_all":"xxx"      //此属性是否包含在_all字段中,默认为包含

    //字符串特有属性

    "analyzer":"xxx",     //定义用于索引和搜索的分析器名称,默认为全局定义的分析器名称。可以开箱即用的分析器:standard,simple,whitespace,stop,keyword,pattern,language,snowball

    "index_analyzer":"xxx",           //定义用于建立索引的分析器名称

    "search_analyzer":"xxx",        //定义用于搜索时分析该字段的分析器名称

    "ignore_above":"xxx"      //定义字段中字符的最大值,字段的长度高于指定值时,分析器会将其忽略

    },

    "published":{

    "type":"date",

    //公共属性

    "store":"yes",

    //日期特有属性

    "precision_step":"0",      //指定为该字段生成的词条数,值越低,产生的词条数越多,查询会更快,但索引会更大。默认4

    "format":"YYYY-mm-dd"          //指定日期格式,默认为dateOptionalTime

    }

    }

    }'

    3       创建映射(非扁平结构)

    在第二章我们讲解了创建映射的语句。所创建的是简单的扁平结构映射。这一章我们看看如何创建非扁平结构映射。

    3.1     树形结构

    树形结构的作用是为索引层级路径提供便利。例如一家汽车店中可能会有如下路径:/cars/passenger/sport、/cars/passenger/camper、/cars/delivery_truck,我们想在搜索cars的时候返回三条记录,搜索cars/passenger的时候返回前两条记录,可以这样建立映射:

    curl -XPUT [address]/path -d '{

    "settings":{

    //定义一个路径分析器

    "index":{

    "analysis":{

    "analyzer":{

    "path_analyzer":{"tokenizer":"path_hierarchy"}

    }

    }

    }

    },

    "mappings":{

    "category":{

    "properties":{

    "category":{

    "type":"string",

    "fields":{

    //定义多字段对象,使用category.path进行查询时将启用路径分析匹配指定路径下的所有文档,使用category.name进行查询时将精确匹配指定路径的文档,略过结构更深的文档。

    "name":{"type":"string","index":"not_analyzed"},

    "path":{"type":"string","analyzer":"path_analyzer","store":true}

    }

    }

    }

    }

    }

    }'

    3.2     对象

    先执行curl –XPUT [address]/extend_mapping,创建extend_mapping索引

    创建一个带有对象属性author的类型book:

    curl –XPUT [address]/extend_mapping/_mapping/book –d ‘{

    "properties":{

    "title":{"type":"string","index":"not_analyzed"},

    "author":{

    "type":"object",

    "properties":{

    "firstName":{"type":"string","index":"not_analyzed"},

    "lastName":{"type":"string","index":"not_analyzed"}

    }

    }

    }

    }’

    3.3     嵌套对象

    嵌套对象允许我们连接一个主文档和多个附属文档,下面通过一个例子来说明嵌套对象的应用场景。

    现在我们有一个服装店,需要设计一个数据结构来存储服装店里的服装信息。例如现在有一种名字为”cloth”的服装,这件服装现有两件存货,一件XXL的红色和一件XL的黑色,请设计一个数据结构来存储该服装信息。

    我们可能会把数据结构设计成这样:

    {

    “name”:”cloth”,

    “variation”:[

    {“size”:”XXL”,”color”:”red”},

    {“size”:”XL”,”color”:”black”}

    ]

    }

    直观的来看,这个数据结构是能够表现我们所描述的服装信息的,我们依据这个结构创建以下映射(发送rest请求语句略):

    {

    "properties":{

    "name":{"type":"string","index":"not_analyzed"},

    "variation":{

    "properties":{

    "size":{"type":"string","index":"not_analyzed"},

    "color":{"type":"string","index":"not_analyzed"}

    }

    }

    }

    }

    建立映射后索引以下数据:

    {

    "name": "cloth",

    "variation": [

    {

    "size": "XXL",

    "color": "red"

    },

    {

    "size": "XL",

    "color": "black"

    }

    ]

    }

    下面我们查询一下我们的服装信息库,看看是否有尺寸为XXL,颜色为black的服装:

    {

    "filter": {

    "and": [

    {

    "term": {

    "variation.size": "XXL"

    }

    },

    {

    "term": {

    "variation.color": "black"

    }

    }

    ]

    }

    }

    出乎意料的是,该查询返回了结果:

    {

    ......(此处信息略去)

    "hits": {

    "total": 1,

    "max_score": 1,

    "hits": [

    {

    "_index": "extend_mapping",

    "_type": "unnested_cloth",

    "_id": "AVACnlA-8eAUpvGq_eZa",

    "_score": 1,

    "_source": {

    "name": "cloth",

    "variation": [

    {

    "size": "XXL",

    "color": "red"

    },

    {

    "size": "XL",

    "color": "black"

    }

    ]

    }

    }

    ]

    }

    }

    这与我们的预期不符,我们只有XXL红色和XL黑色两件服装,并没有所查询的XXL黑色服装。

    这是因为按照我们之前定义的映射结构,尺寸信息(“size”:”XXL”,”size”:”XL”)和颜色信息(“color”:”red”,”color”:”black”)都存在同一个文档中,ES无法将XXL和red、XL和black绑定在一起,因此在查询时造成了混淆。

    解决的方法就是使用嵌套对象,将variation对象的类型指定为嵌套:

    重新创建以下映射:

    {

    "properties":{

    "name":{"type":"string","index":"not_analyzed"},

    "variation":{

    “type”:”nested”,

    "properties":{

    "size":{"type":"string","index":"not_analyzed"},

    "color":{"type":"string","index":"not_analyzed"}

    }

    }

    }

    }

    索引之前的测试数据:

    {

    "name": "cloth",

    "variation": [

    {

    "size": "XXL",

    "color": "red"

    },

    {

    "size": "XL",

    "color": "black"

    }

    ]

    }

    现在我们通过”type”:”nested”将variation对象指定为嵌套对象,需要注意的是,如果我们对新映射执行类似之前的查询,将无任何文档返回。因为对于嵌套映射,必须要使用专用的查询语法,如下:

    {

    "filter": {

    "nested": {

    "path": "variation",

    "filter": {

    "and": [

    {

    "term": {

    "variation.size": "XXL"

    }

    },

    {

    "term": {

    "variation.color": "black"

    }

    }

    ]

    }

    }

    }

    }

    这次的查询如我们的预期,没有返回结果。这是因为使用嵌套结构后,当我们索引测试数据时,事实上ES生成了3个文档,一个cloth的主文档,和两个variation对象的附属文档,这样就分离存储了两件服装存货,避免了尺寸和颜色的混淆。

    展开全文
  • 这里用百度百科的一句话来说,在关系数据库中,索引是一种单独的、物理的对数据库表中一列或列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针...

    我们在学习MySQL的时候经常会听到索引这个词,大概也知道这是什么,但是深究下去又说不出什么道道来。下面将会比较全面的介绍一下关于索引!

    索引是什么?

    这里用百度百科的一句话来说,在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。

    简单来说,索引就是我们一本书的目录,通过目录我们才能更快在一本书中查找到我们所要看的内容。同样的,通过索引我们才能在数据库中查找到我们的数据!

    没使用索引的MySQL

    我们知道索引可以加快我们的查找,所以这里通过没有使用索引的查找可以更加地让我们认识到使用索引的好处。

    我们的MySQL基本的页存储结构是页,也就是我们的数据记录都在页里面。

    d15f5174b3e1dcd751d376fb5eae0558.png

    当我们插入一条记录的时候就会存储在我们的数据页中的存放行记录的位置,并在我们的Page Directory页目录那里生成主键的信息。我们的数据页中记录又可以组成一个单链表,每插入一条数据就会在尾节点那里添加上。

    678f3e9fa1fceb7d77df9516972046ef.png

    当我们通过主键查找某条记录的时候可以在页目录中使用二分法快速定位到对应的槽,然后再遍历该槽对应分组中的记录即可快速找到指定的记录。如果不是主键的话,那么只能遍历单链表中的每条记录对比查找。

    所以,如果不用索引优化的话,那么在进行一条查找的sql的话,默认的流程是这样子的:

    定位到记录所在的页(需要遍历双向链表,找到所在的页)

    从所在的页内中查找相应的记录(是不是根据主键查询,不是只能遍历所在页的单链表了)

    如果在数据量特别大的时候,又是极端情况,遍历双向链表和单链表,速度就会显得非常慢!

    B-Tree索引与B+Tree索引

    B-Tree索引结构

    当人们开始谈论索引的时候,如果没有特别指明类型的话,那么多半说的就是B-Tree(B树)所以,它使用的是B-Tree数据结构来存储数据,大多数的MySQL引擎都支持这种索引(但实际上很多存储引擎使用的是B+Tree,这个我们稍后再谈到)。我们这里通过B-Tree索引结构就可以极大的优化了上面的查找。

    c2a91f1704ed4a496252349acbcf75ba.png

    从图中我们可以很明显的感受到,使用索引后,就不需要再遍历双向链表那样去查找页,而是通过目录就可以很快的定位到我们的实际的页。如查找id为1的数据

    首先小于4,可以确定在p1下,指向磁盘页2

    在磁盘页里面,小于2,指向p1,然后查找到

    而且,我们也可以根据图总结出B-Tree的特点:

    所有键值数据分布在整棵树各个节点中

    我们的查找有可能在非节点结束,比如上图中,我们要找id为4的数据的话,在根节点就可以查找到

    所有叶子节点都在同一层,并且以升序排列

    B+Tree索引结构

    B+Tree索引是依据B-Tree索引基础上的一次优化,具体变化如下:

    B+Tree 非叶子节点不存放数据

    叶子节点存储关键字和数据,非叶子节点的关键字也会沉到叶子节点,并且排序

    叶子节点两两指针相互连接,形成一个双向环形链表(符合磁盘的预读特性),顺序查询性能更高(区间查找更加方便)

    abbc7841e689427ecc85a3a351af0510.png

    我们的B+Tree的优化到底有什么好处呢?

    首先是我们的数据只放在了叶子节点上面。这个唯一的好处就是我们的非叶子节点可以存放更多的关键字了,整体就可以存放更多的数据。因为我们MySQL查询过程是按页加载数据的,每加载一页就是一次IO操作,我们根磁盘页存放的数据越少,关键字越多,那么整体的数据量就可以说是越多。

    还有一个好处就是,在叶子节点形成双向环形链表。这样子如果要进行区间查询的话,只需要顺着叶子节点的指针向下查询就行。而如果是B-Tree的话,就需要返回上一级节点然后再读取磁盘页进行查找,节省了不少时间!

    为什么不采用别的树结构?

    为什么要采用B-Tree的结构,甚至是B+Tree的结构呢?

    其实还是跟我们的磁盘读取的原因有关。上面我们说到了,MySQL查询过程是按页加载数据的。而我们的操作系统一般将内存和磁盘分割成固定大小的块,每一块称为一页,内存与磁盘以页为单位交换数据。我们的内存每次读取的就是MySQL分割成的一个页大小,也就是一个索引点,图中的一个磁盘页。

    采用普通二叉树?不!

    如果采用普通的二叉树的话,我们要考虑到一种情况。那就是在极端的情况下,一棵树是会退化成链表的,那么树的优点就没有了。 这与我们原来用双向链表有何异同?

    2a0e35246d029a77b47707c8b51c6723.png

    采用红黑树?不!

    那么可能有人说了,如果采用红黑树,树保持平衡不就行了吗?确实,红黑树等平衡树也可以用来实现索引,但是与我们的B-Tree/B+Tree来说性能要差很多。

    我们上面说到了内存每一次I/O都是载入一个索引节点,也就是一个磁盘页。如果数据不在同一个磁盘块上,那么通常需要移动制动手臂进行寻道,而制动手臂因为其物理结构导致了移动效率低下,从而增加磁盘数据读取时间。B-Tree/B+Tree相对于红黑树有更低的树高,进行寻道的次数与树高成正比,在同一个磁盘块上进行访问只需要很短的磁盘旋转时间,所以 B-Tree/B+Tree 树更适合磁盘数据的读取。

    而且为了减少磁盘 I/O 操作,磁盘往往不是严格按需读取,而是每次都会预读。预读过程中,磁盘进行顺序读取,顺序读取不需要进行磁盘寻道,并且只需要很短的磁盘旋转时间,速度会非常快。并且可以利用预读特性,相邻的节点也能够被预先载入。

    哈希索引

    MySQL除了B+树之外,还有一种常见的是就是哈希索引。

    哈希索引就是采用一定的哈希算法,把键值换算成新的哈希值,检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需一次哈希算法即可立刻定位到相应的位置,速度非常快。

    本质上就是把键值换算成新的哈希值,根据这个哈希值来定位。

    07c0d0338117f648b28bc8f656f9ac7f.png

    使用哈希索引最大的好处就是速度特别快,我们只需要一次定位就可以找到我们要的数据。时间复杂度为O(1),但是我们的InnoDB(MySQL默认存储引擎)默认使用的却是B+树索引,这也是因为哈希索引有一定的缺点:

    无法用于排序和分组

    只支持精确查找,无法用于部分查找和范围查找

    在有大量重复键值情况下,哈希索引的效率也是极低的---->哈希碰撞问题。

    不支持最左匹配原则

    可是如果一个索引值被频繁使用的话,我们的InnoDB会再B+Tree索引之上再创建一个哈希索引,用来方便快速查找。这个功能叫做“自适应哈希索引”。

    聚簇索引与辅助索引

    MySQL数据库中innodb存储引擎,B+树索引可以分为聚簇索引(也称聚集索引,clustered index)和辅助索引(有时也称非聚簇索引或二级索引,secondary index,non-clustered index)。这两种索引内部都是B+树,聚集索引的叶子节点存放着一整行的数据。

    Innodb中的主键索引是一种聚簇索引,非聚簇索引都是辅助索引,像复合索引、前缀索引、唯一索引。

    聚簇索引

    聚簇索引就是按照每张表的主键构造一颗B+树,同时叶子节点中存放的就是整张表的行记录数据,也将聚集索引的叶子节点称为数据页。这个特性决定了索引组织表中数据也是索引的一部分,每张表只能拥有一个聚簇索引。

    Innodb通过主键聚集数据,如果没有定义主键,innodb会选择非空的唯一索引代替。如果没有这样的索引,innodb会隐式的定义一个主键来作为聚簇索引。

    使用聚簇索引的优点:

    数据访问更快,因为聚簇索引将索引和数据保存在同一个B+树中,因此从聚簇索引中获取数据比非聚簇索引更快

    聚簇索引对于主键的排序查找和范围查找速度非常快

    缺点:

    插入速度严重依赖于插入顺序,按照主键的顺序插入是最快的方式,否则将会出现页分裂,严重影响性能。因此,对于InnoDB表,我们一般都会定义一个自增的ID列为主键

    更新主键的代价很高,因为将会导致被更新的行移动。因此,对于InnoDB表,我们一般定义主键为不可更新。

    二级索引(辅助)访问需要两次索引查找,第一次找到主键值,第二次根据主键值找到行数据。

    Innodb中聚簇索引示意图:

    3cba00fa53cb8af85f1761e3af1e9b13.png

    InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。

    辅助索引

    在聚簇索引之上创建的索引称之为辅助索引,辅助索引访问数据总是需要二次查找。辅助索引叶子节点存储的不再是行的物理位置,而是主键值。通过辅助索引首先找到的是主键值,再通过主键值找到数据行的数据页,再通过数据页中的Page Directory(页目录)找到数据行。

    Innodb辅助索引的叶子节点并不包含行记录的全部数据,叶子节点除了包含键值外,还包含了相应行数据的聚簇索引键。辅助索引的存在不影响数据在聚簇索引中的组织,所以一张表可以有多个辅助索引。在innodb中有时也称辅助索引为二级索引。

    Innodb中辅助索引示意图:

    5063f267c214203f6faf1c458c5f38db.png

    通过对比我们就可以知道为什么我们对主键会有要求:

    1、为什么不建议使用过长的字段作为主键,因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大。

    2、为什么用非单调的字段作为主键在InnoDB中不是个好主意,因为InnoDB数据文件本身是一颗B+Tree,非单调的主键会造成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效,而使用自增字段作为主键则是一个很好的选择。

    当然,如果我们通过索引优化,将辅助索引优化成覆盖索引,那么辅助索引也包含所有需要查询的字段的值。也就是我们的索引就是我们要的值,无需再访问主索引了。这里,涉及到索引的优化不过多介绍!

    MyISAM实现对比

    上面我介绍了在InnoDB存储引擎下的聚簇索引与辅助索引的实现,因为如果没有说明具体的数据库和存储引擎,默认指的是MySQL中的InnoDB存储引擎。但是我们MySQL还支持MyISAM存储引擎,它也是支持聚簇索引与辅助索引的。

    但是该引擎下的实现却有些不同,我们的聚簇索引和辅助索引没有什么区别,他们的叶子节点都不存放数据,而是存放数据记录的地址。唯一的区别就是聚簇索引要求key是唯一的,而辅助索引的key可以重复。

    所以如果严格的按照聚簇索引叶子节点存放数据来定义的话,MyISAM的索引都只能算是非聚簇索引!聚簇索引,或者严格说主键索引示意图:

    415bdea20ec85db0ca5b4917de67dbaf.png

    辅助索引示意图:

    5a11e65ecf66a10b0d037f317ba5d6d1.png

    为了更形象说明这两种存储引擎下两种索引的区别,我们假想一个表如下图存储了4行数据。其中Id作为主索引,Name作为辅助索引。图示清晰的显示了聚簇索引和非聚簇索引的差异。

    9db175dda42b4f6f9b03c21208552690.png

    索引优点及使用

    我们通过结构对比了使用索引的好处,总结下来的话就是:

    大大减少了服务器需要扫描的数据行数

    帮助服务器避免进行排序和分组,以及避免创建临时表(B+Tree 索引是有序的,可以用于 ORDER BY 和 GROUP BY 操作。临时表主要是在排序和分组过程中创建,不需要排序和分组,也就不需要创建临时表)

    将随机 I/O 变为顺序 I/O(B+Tree 索引是有序的,会将相邻的数据都存储在一起)

    但是我们要知道,索引并不是最好的解决方案。总的来说,只有当索引帮助存储引擎快速找到记录带来的好处大于其带来的额外工作时,索引才是有效的。

    对于非常小的表、大部分情况下简单的全表扫描比建立索引更高效;

    对于中到大型的表,索引就非常有效;

    但是对于特大型的表,建立和维护索引的代价将会随之增长。这种情况下,需要用到一种技术可以直接区分出需要查询的一组数据,而不是一条记录一条记录地匹配,例如可以使用分区技术(具体可以查看高性能MySQL第七章)。

    总结

    这里仅仅是介绍了索引结构原理等,关于索引还有很多,如全文索引,空间索引等,以及索引的优化之类,这更多是我们要去学习的。

    参考资料

    展开全文
  • 二:如何创建索引(数据库)结构?三:如何向已有索引(数据库)中添加类型(表)结构?四:如何向已有类型(表)中添加新字段?五:如何更改现有类型(表)中的字段类型?六:如何删除索引(数据库)?七:如何删除索引中某一个...

    从问题出发,这篇内容可以解决以下几个问题:

    一:如何开启关闭Es索引(数据库)?

    二:如何创建索引(数据库)结构?

    三:如何向已有索引(数据库)中添加类型(表)结构?

    四:如何向已有类型(表)中添加新字段?

    五:如何更改现有类型(表)中的字段类型?

    六:如何删除索引(数据库)?

    七:如何删除索引中某一个类型结构(同时删除数据以及数据结构)?

    八:如何删除索引中某一类型结构的全部数据而不删除类型结构?

    九:为什么同一索引下不同类型的结构如果字段名称相同会报错?

    十:创建索引结构时注意事项以及问题?

    一:如何开启关闭Es索引(数据库)?

    关闭索引

    POST /my_index/_close

    开启索引

    POST /my_index/_open

    二:如何创建索引(数据库)结构?

    PUT twitter

    {"mappings": {"tweet": {"properties": {"message": {"type": "text"}

    }

    }

    }

    }

    三:如何向已有索引(数据库)中添加类型(表)结构?

    PUT twitter/_mapping/user

    {"properties": {"name": {"type": " keyword"}

    }

    }

    四:如何向已有类型(表)中添加新字段?

    PUT twitter/_mapping/tweet

    {"properties": {"user_name": {"type": " keyword"}

    }

    }

    五:如何更改现有类型(表)中的字段类型?

    无法更改;

    六:如何删除索引(数据库)?

    七:如何删除索引中某一个类型结构(同时删除数据以及数据结构)?

    Elasticsearch不支持删除一个Type;

    八:如何删除索引中某一类型结构的全部数据而不删除类型结构?

    POST /testindex/testtype/_delete_by_query?pretty

    {"query": {"match_all": {

    }

    }

    }

    九:为什么同一索引下不同类型的结构如果字段名称相同会报错?

    这个问题比较坑,什么意思呢?用我们使用关系型数据库的逻辑来说,就是同一个数据库里面,如果有两个不同的表,表里面都有name字段,

    如果A表中name是varchar类型,B表中name是int类型,完了,这就没办法创建索引了。所以,我们在创建索引的时候要注意,为什么会有这样的问题呢?

    难道是Es的bug?这个主要是因为Es使用的是lucene的框架,具体的原因大家可以参考官方文档 避免类型陷阱

    十:创建索引结构时注意事项以及问题?

    1:  明确字段存储类型,是int类型还是文本类型;

    2:  文本类型情况下,一种是keyword,一种是text ;

    3:  字段结构类型一旦定义之后,是无法修改的,就跟你在数据库中一样,以前是int类型,

    是无法改成varchar类型的(在sqlserver 表中没有数据情况下可以修改)。

    4:  如果需要修改结构类型,只能在在这个文档类型中新增一个字段了。

    5:  同一个索引下面,字段名称尽量不要重复;

    6:  字段名称如果有重复情况,一定要使用相同的字段类型,要么都是integer,要么都是text。

    展开全文
  • 【MySQL】mysql索引结构及其原理

    千次阅读 2021-01-19 04:38:10
    索引就是数据库创建的满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据2、索引数据结构目前大部分数据库系统及文件系统都采用B Tree或其变种B+Tree作为索引结构相关概念介绍B-树(B树):路搜索树...
  • mysql 存储引擎的索引结构存储引擎定义:数据库引擎是用于存储、处理和保护数据的核心服务。利用数据库引擎可控制访问权限并快速处理事务,从而满足企业内大多数需要处理大量数据的应用程序的要求。使用数据库引擎...
  • 索引的三星原则1....一个常见的错误就是,为每个列建立独立的索引,或者按照错误的顺序创建多索引。我们会在稍后的章节中单独讨论索引列的顺序问题。先来看第一个问题,为每个列创建独立的索引,从SHOW C...
  • 创建索引会占据磁盘空间; 索引提高查询效率,但是会降低更新表的效率。 都有哪些索引? 主键索引:用于标识索引列的值唯一,不允许有空值; 唯一索引:用于标识索引列的值唯一,但是运行有空值;
  • ES索引结构及存储原理 ES(ElasticSearch)是一款分布式全文检索框架,底层基于基于Lucene实现。 Elasticsearch中的字段类型可以分为两类:精确值和全文。精确值 如它们听起来那样精确。例如日期或者用户 ID,但字符串...
  • Innodb 表和索引结构

    2021-02-08 16:59:01
    表的结构:对于MySQL把有的存储引擎都是把表结构的定义存放到.frm文件中。但对于Innodb表同时有一个内部的字典存放到表空间中。...在.frm文件只是用来定义表的结构,Innodb把数据和索引都存放到了表空间中。...
  • 原文链接:https://www.2cto.com/database/201612/573841.html往期精选Mysql-索引结构直观图解。上一篇刚刚通俗化的说明了B-TREE的几个结果与存储方式,其实跟索引感觉上还是没有关联起来, 那么本篇,就通过实际的一...
  • mysql索引结构和特点

    2021-02-04 16:16:14
    索引存储在文件中,也会占内存大小,所以不要乱建索引。 在介绍数据结构之前,先给大家推荐一个在线演示数据结构的网址。点我,这个网址能够让大家清晰的认识到数据结构是怎么存储的。下面演示也是用的这个网址 ...
  • 原文连接地址:http://leeyin.iteye.com/blog/441350什么是索引索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树...如果作为搜索条件的列上已经创建索引,MySQL无需扫描任何记录即可迅速得到目标...
  • 组合索引的索引结构

    2021-03-21 18:07:57
    在网络上有很MySQL的索引结构的介绍,相信你对索引结构已经非常了解了,关于组合索引呢?组合索引是在B+树中的结构是怎么样的?怎么排序的?索引中相同的值,存储的id是什么结构?在本篇文章中就跟你一一说明 ...
  • MySQL索引结构

    2021-02-22 13:36:14
    MySQL索引结构 B+Tree BTree 按页加载和保存
  • 转载出:http://blog.csdn.net/qq_19557947/article/details/76951912一、Mysql索引主要有两种结构:B+Tree索引和Hash索引Hash索引mysql中,只有Memory(Memory表只存在内存中,断电会消失,适用于临时表)存储引擎...
  • 我们在下一篇讨论索引列次序的问题,首先看一下列独立索引的情况,以下面的表结构为例:CREATE TABLE test (c1 INT,c2 INT,c3 INT,KEY(c1),KEY(c2),KEY(c3),);使用这种索引策略通常是一些权威的建议(例如在WHERE...
  • 数据库中索引结构是一种排序的数据结构。是通过B树和变形的B+树实现的。 适合建索引: 经常查询,使用,用在表连接的字段(经常更改的字段不适合建索引
  • 创建索引(空的,无数据): 需要复制数据的旧索引: 复制索引数据语句: POST _reindex/ { "source": { "index": "ceshi1" }, "dest": { "index": "test_0904", "op_type": "create" } } 写法...
  • 这样的话,就需要考虑空间占用了,比如,name 和 age 的联合索引,name 字段比 age 字段占用空间大,所以创建(name,age)联合索引和(age)索引占用空间是要小于(age,name)、(name)索引的。 2.3 索引下推 以...
  • 从MySQL 8.0.17开始, InnoDB支持创建多索引(Multi-Valued Indexes),该索引是在JSON存储值数组的列上定义的二级索引,对于单个数据记录可以有索引记录。跟普通索引一样,也可以在`EXPLAIN`中查看到。
  • MySQL 索引结构

    万次阅读 多人点赞 2021-05-26 20:42:33
    在上一篇 MySQL 索引类型 中,我们已经了解了索引的基本概念以及分类,那么,索引结构是什么样的?为什么索引可以这么快?这一篇文章将继续探讨索引的实现原理和数据结构。 文章目录前言索引数据结构二叉树的局限...
  • 在网络上有很MySQL的索引结构的介绍,相信你对索引结构已经非常了解了,关于组合索引呢?组合索引是在B+树中的结构是怎么样的?怎么排序的?索引中相同的值,存储的id是什么结构?在本篇文章中就跟你一一说明 ...
  • mysql之innodb索引结构

    2021-08-09 09:59:13
    这次我们再来了解innodb的索引结构;在上一篇中我们说到record_type 有4种属性,其中1表示目录项记录,这次我们重点讲的就是这个。存储结构上一篇讲解的时候只是在强调InnoDB的数据页。在页之上有段,段之上有区,...
  • 创建索引是指在某个表的一列或列上建立一个索引,以便提高对表的访问速度。创建索引有3种方式,这3种方式分别是创建表的时候创建索引、在已经存在的表上创建索引和使用ALTER TABLE语句来创建索引。本节将详细讲解...
  • 查看索引 show index from 数据库表名alter table 数据库add index 索引名称(数据库字段名称)PRIMARY KEY(主键索引)ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )UNIQUE(唯一索引)ALTER TABLE `table_name...
  • 首页 专栏 mysql 文章详情0MySQL 索引类型、索引结构、索引的操作 小伍 发布于 1 月 24 日索引分类单列索引:一个索引只包含一个列。ALTER TABLE table_name ADD INDEX index_name (col);复合索引:一个索引包含个...
  • 一、开始创建索引您可以通过 Elasticsearch 的 RESTFul API 来创建索引:PUThttp://127.0.0.1:9200/commodity注意:默认情况下,创建的索引分片数量是 5 个,副本数量是 1 个。您可以通过如下参数来指定分片数、副本...
  • 如果分别按纳税人识别号,税务机关代码,月份3个字段查询,每个字段在该表中的可选性或约束性都不强,如一个纳税人识别号有很纳税记录,一个税务机关代码和同一月份记录就更了,所以3个字段合起来,"某个纳税人识别号+...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 649,441
精华内容 259,776
关键字:

多建索引结构