怎么查看字段上的索引 是否引用上

本文深入探讨了数据库索引的建立原则与优化策略,包括如何在表的主键、外键、数据量、连接字段、常用查询字段、选择性、字段大小、复合索引、频繁操作表等方面做出合理判断,以提升数据库性能。

建立索引常用的规则如下:
 1、表的主键、外键必须有索引;

 2、数据量超过300的表应该有索引;

 3、经常与其他表进行连接的表,在连接字段上应该建立索引;

 4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;

 5、索引应该建在选择性高的字段上;

 6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;

 7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:

    A、正确选择复合索引中的主列字段,一般是选择性较好的字段;

    B、复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引;

    C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;

    D、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;

    E、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;

 8、频繁进行数据操作的表,不要建立太多的索引;

 9、删除无用的索引,避免对执行计划造成负面影响;

    以上是一些普遍的建立索引时的判断依据。一言以蔽之,索引的建立必须慎重,对每个索引的必要性都应该经过仔细分析,要有建立的依据。因为太多的索引与不充分、不正确的索引对性能都毫无益处:在表上建立的每个索引都会增加存储开销,索引对于插入、删除、更新操作也会增加处理上的开销。另外,过多的复合索引,在有单字段索引的情况下,一般都是没有存在价值的;相反,还会降低数据增加删除时的性能,特别是对频繁更新的表来说,负面影响更大。

<think>我们正在讨论Elasticsearch中如何向已有索引添加新字段。根据用户提供的引用,特别是引用[2]和引用[3],我们可以总结出以下方法: 引用[2]展示了使用PUT请求向索引`skus`添加两个字段(`sku_extendInfo`和`sku_stock`)的示例。 引用[3]则展示了使用POST请求向索引`index`的类型`type`添加字段`name`的示例。 注意:在Elasticsearch 6.x及以后版本中,一个索引只能有一个类型(type),通常使用`_doc`作为类型名,或者直接省略类型名(在API中使用类型名)。在7.x及以上版本中,类型(type)已经被移除,因此再需要指定类型。 用户的环境是Elasticsearch 6.7(来自引用[1]),因此需要指定类型。在引用[1]的示例中,类型名为`_doc`。 因此,向已有索引添加字段的步骤如下: 1. 确定索引名称和类型(在6.x版本中,类型通常是`_doc`,或者创建索引时指定的类型)。 2. 使用PUT或POST请求,向`/{index_name}/_mapping`端点发送映射更新请求,其中包含要添加的字段及其属性。 根据引用[2]和引用[3],有两种请求方式(PUT和POST)都可以,但推荐使用PUT(因为映射更新本质上是修改索引的元数据,通常使用PUT方法)。 具体操作: 方法一(使用PUT,如引用[2]所示): ```bash PUT /{index_name}/_mapping { "properties": { "new_field1": { "type": "text" }, "new_field2": { "type": "integer" } } } ``` 方法二(使用POST,如引用[3]所示): ```bash POST /{index_name}/_mapping { "properties": { "new_field1": { "type": "text" } } } ``` 注意:在Elasticsearch 6.7中,由于每个索引只有一个类型,所以需要在URL中指定类型(即需要`/{index_name}/{type}/_mapping`),因为类型名是固定的(默认为`_doc`)。实际上,在6.7中,我们可以直接使用索引级别的`_mapping`端点。 但是,如果用户创建索引时指定了类型名(例如在引用[1]中,创建索引时指定了类型名为`_doc`),那么更新映射时,类型名也是`_doc`。过,在6.7版本中,官方推荐使用`_doc`作为类型名,并且更新映射时需要在URL中显式写出类型名(直接使用索引级别的`_mapping`端点即可)。 因此,在Elasticsearch 6.7中,我们可以按照以下步骤操作: 步骤: 1. 使用PUT或POST请求,URL为:`http://<elasticsearch_host>:<port>/<index_name>/_mapping` 2. 在请求体中,按照上述格式指定要添加的字段。 示例(添加一个名为`description`的文本字段和一个名为`price`的浮点数字段): ```bash PUT /my_index/_mapping { "properties": { "description": { "type": "text" }, "price": { "type": "float" } } } ``` 注意:在Elasticsearch中,向已有索引添加字段是允许的,但有一些限制: - 能修改已有字段的映射(例如,能将字符串字段从`text`改为`keyword`)。 - 新增的字段将只对后续写入的数据生效,已有的文档中会自动包含该字段(但可以通过更新已有文档来添加该字段)。 另外,如果新增的字段需要设置其他属性(如`doc_values`、`norms`等),可以参考引用[3]的格式设置。 最后,由于用户使用的是阿里云Elasticsearch 6.7,需要注意阿里云是否有额外的限制(比如权限控制等)。 总结回答: 在Elasticsearch 6.7中,向已有索引添加新字段的方法是通过更新索引映射(mapping)来实现。具体操作如下: 1. 使用PUT或POST请求,请求地址为:`/<索引名称>/_mapping` 2. 请求体中包含`properties`对象,列出要添加的字段及其属性(如类型、是否索引等)。 示例:向索引`products`中添加一个`tags`字段(类型为`keyword`)和一个`quantity`字段(类型为`integer`): ```bash PUT /products/_mapping { "properties": { "tags": { "type": "keyword" }, "quantity": { "type": "integer" } } } ``` 操作成功后,Elasticsearch会返回`{"acknowledged": true}`。 注意事项: - 该操作会更新已有文档,只会影响后续写入的文档。若要更新已有文档,需要执行update操作。 - 能修改已有字段的映射属性。 根据用户提供的引用,我们特别参考了引用[2]和引用[3]的示例。 生成相关问题: 1. 如何验证新增字段是否成功? 2. 新增字段后,如何更新已有文档的该字段值? 3. 如果新增字段时发生错误(例如字段类型错误),该如何处理? 4. 在Elasticsearch 7.x及以上版本中,添加字段的方法有什么同? </think>以下是 Elasticsearch 在**已有索引上新增字段**的完整操作指南,适用于 Elasticsearch 6.x+ 版本: --- ### 操作步骤(基于引用[2][3]最佳实践) #### 1. 确认索引名称和字段类型 ```bash # 查看现有索引的映射结构 GET /your_index_name/_mapping ``` #### 2. 执行新增字段操作 使用 `PUT` 或 `POST` 更新映射(两者等效): ```bash # 推荐方式(引用[2]) PUT /your_index_name/_mapping { "properties": { "new_field": { # 新字段名称 "type": "text", # 字段类型 "doc_values": false, # 可选参数(引用[3]) "norms": false }, "another_field": { # 可同时添加多个字段 "type": "keyword" } } } ``` #### 3. 验证结果 - **响应成功标志**: ```json {"acknowledged": true} # 引用[2] ``` - 查看更新后的映射: ```bash GET /your_index_name/_mapping ``` --- ### 关键注意事项 1. **兼容性规则** - **ES 6.x**:需在 URL 中指定类型名(如 `/_doc/_mapping`),但索引级操作更安全(引用[1]) - **ES 7.x+**:无需类型名(直接 `/_mapping`) 2. **字段类型限制** ✔️ 允许新增:`text`, `keyword`, `integer`, `date` 等 ❌ **禁止修改**:已存在字段的类型或属性(需重建索引) 3. **数据行为** - 新增字段**会自动填充**旧文档(值为 `null`) - 旧文档需通过 `_update` API 单独补值 --- ### 完整示例 向索引 `products` 添加 `stock_count`(整数类型)和 `description`(文本类型): ```bash PUT /products/_mapping { "properties": { "stock_count": { "type": "integer" }, "description": { "type": "text", "analyzer": "ik_max_word" # 中文分词器 } } } ``` --- ### 相关问题 1. 如何在新增字段后为旧文档批量填充默认值? 2. 修改已有字段类型会有什么后果?如何安全操作? 3. 如何验证新增字段是否会影响查询性能? 4. Elasticsearch 7.x 与 6.x 的映射更新有何区别? [^1]: 索引结构与类型规范 [^2]: 新增字段操作语法及响应 [^3]: 字段参数配置选项
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值