`
王之子
  • 浏览: 110367 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

索引的代价

阅读更多

在使用索引的时候,我们同样需要考虑代价,但是不用为代价感到恐惧,我们只需要思考是否值得。

首先,索引会占据更多的磁盘空间,很多时候索引甚至比数据本身还要大,比如将拥有100万行记录的表转为MyISAM类型后,可以看到索引文件(MYI 文件)的大小几乎是数据文件(MYD 文件)的两倍。

 

我们来创建这样一个数据表: 

 

 

CREATE TABLE `key_t` (  
  `id` int(11) NOT NULL,  
  `key1` int(11) NOT NULL DEFAULT '0',  
  `key2` int(11) NOT NULL DEFAULT '0',  
  `key3` int(11) NOT NULL DEFAULT '0',  
   PRIMARY KEY (`id`),  
   KEY `normal_key` (`key1`,`key2`,`key3`)  
) ENGINE=MyISAM DEFAULT CHARSET=utf8;  

 这个数据表建立了一个包含了三个字段的组合索引 normal_key,同时它还有一个自增类型的主键。我们为这个表填充了 100 万行的记录,其中 key1、key2、key3的内容均为0到999的随机整数。


 

先如今,存储空间比计算时间要廉价得多,TB 级别的高速磁盘任你选择,而且大多数情况下在磁盘空间写满之前,计算能力的瓶颈早已迫使数据库进行扩展,所以你几乎不用担心索引空间的增长,从这一点上看,牺牲空间换取时间是值得的。

 

其次,当建立索引的字段发生更新时,会引发索引本身的更新,这将产生不小的计算开销。一个简单的测试,上面建立的 key_t 表,在不使用组合索引和使用组合索引两种情况下测试插入数据的性能,结果如下表所示:

 

 

 可以看到有接近一倍的差距。同样,对于 update、delete 等查询,一旦涉及索引字段的变更,也会引发索引计算,导致更多的时间开销。

 

是否使用索引取决于站点的应用和你的权衡,mysqlreport 中有一部分数据统计给你提供参考:



 通过它,我们了解了站点中各种类型查询数量的比例,比如上面告诉我们在所有 DMS 查询中,select 占据了 85.56%,而 update 和 delete 加起来一共不到15%,牺牲更新时间换取读取时间是值得的。

  • 大小: 16.1 KB
  • 大小: 54.3 KB
  • 大小: 30.2 KB
分享到:
评论

相关推荐

    基于代价的慢查询优化建议.docx

    ##### 3.6 候选索引代价评估 根据代价模型对每个候选索引进行评估,选择代价最小的索引作为推荐结果。 #### 四、推荐质量保证 ##### 4.1 有效性验证 通过实际运行查询来验证推荐索引的有效性。 ##### 4.2 效果...

    论文研究-向量空间划分类索引的动态更新代价分析.pdf

    代价分析是借助代价模型预测和评估空间索引结构的一种有效方法。针对索引的空间划分和数据划分这两种策略,在已有的索引结构基础上建立了向量空间划分类型索引的代价模型,该模型可实现查询以及动态更新的性能评价。...

    mysql 相关介绍以及优化

    MySQL 的索引代价包括: * 索引文件的创建和维护 * 索引文件的存储空间占用 * 索引文件的更新和修改 在选择哪些列上创建索引时,需要考虑以下因素: * 频繁作为查询条件的字段 * 唯一性太差的字段不适合创建索引...

    北邮大三数据库实验六数据查询分析实验_(2).docx

    本实验中,我们将比较有索引和无索引情况下插入数据的执行效率,结果表明,索引代价是数据库性能优化的重要考虑因素。 知识点7:查询重写 查询重写是查询优化的重要手段之一。本实验中,我们将比较相同查询功能的...

    北邮数据库实验六数据查询分析实验.docx

    - **索引代价**:虽然索引提高了查询速度,但插入数据时,有索引的表可能需要更多时间,因为索引需要更新。 **2. 不同查询语句的执行比较** - **GROUP BY**: - 使用`GROUP BY`和不使用`GROUP BY`的查询效率不同...

    北邮大三数据库实验六数据查询分析实验.docx

    - **索引代价**:观察在插入和删除数据时,有无索引对操作速度的影响。通常,索引会提高查询速度,但可能降低数据修改的速度。 2. **不同查询语句的执行比较分析** - **GROUP BY与HAVING子句**:比较使用GROUP BY...

    OceanBase查询优化器工程方案.pptx

    例如,评估索引代价时,不仅要考虑扫描索引的行数,还要考虑回表的代价。在LSM-TREE存储引擎中,由于Purge逻辑的存在,统计信息需要实时更新以反映数据的变化,从而更准确地预测查询性能。 总之,OceanBase查询优化...

    mysql存储与索引技术

    但是,索引并非没有代价,它们占用磁盘空间,并可能影响插入和更新操作的速度。对于 InnoDB 引擎,当表空间文件(ibdata1)过大且无法收缩时,可以通过修改配置文件(如 /etc/my.cnf)中的 `innodb_file_per_table` ...

    MySQL索引分析及优化.pdf

    表里面的记录数量越多,这个操作的代价就越高。 二、索引的优点 索引的使用可以带来以下几个优点: * 提高查询速度:索引可以快速地定位目标记录所在的位置,从而减少查询时间。 * 降低数据库负载:索引可以减少...

    大数据环境下mongoDB为何要加索引浅析

    1. **权衡索引代价**:虽然索引能提升查询速度,但会占用额外的存储空间,并且在插入、更新和删除操作时需要维护索引,可能会增加写操作的开销。 2. **索引选择**:根据查询模式选择合适的索引,避免创建过多无用的...

    ORACLE9i_优化设计与系统调整

    §12.3.2 索引代价 139 §12.3.3 分析统计数据 139 §12.3.4 避免复杂的表达式 142 §12.3.5 处理复杂的逻辑 143 §12.3.6 一般的SQL语句优化 143 §12.4 SQL语句优化技巧 144 §12.4.1 对所有SQL语句执行EXPLAIN_...

    MySQL数据库:索引概述.pptx

    随着表中记录数量的增长,这种全表扫描的代价会显著增加。通过创建索引,数据库可以快速定位到特定值所在的记录,就像使用书的目录找到相应页码一样。索引提供了指针,按照指定的排序顺序排列,使得数据检索变得高效...

    优化SQL Server索引的小技巧

    在绝大多数情况下,重建索引可以更好的消除碎片,但是这个优点是以阻塞当前发生在该索引所在表格上其它动作为代价换取来的。 在执行查询时,SQL Server 动态选择使用哪个索引。为此,SQL Server 根据每个索引上分布...

    04-VIP-Mysql索引优化实战一.pdf

    这是因为对于小表,全表扫描的代价相对较低,而建立和使用索引的开销可能超过其带来的益处。 总之,MySQL索引优化涉及到对查询语句的理解、索引设计的合理性以及根据数据量和查询模式选择合适的索引使用策略。在...

    oracle索引被限制的一些情况

    这样,在采用基于规则的优化器而不是基于代价的优化器时,将会使用索引。 限制2:使用 IS NULL 或 IS NOT NULL 使用 IS NULL 或 IS NOT NULL 也会限制索引的使用。因为 NULL 值并没有被定义。在 SQL 语句中使用 ...

    索引的SQL语句优化

    18. **决定使用全表扫描还是使用索引**:评估不同查询策略的代价,根据具体情况选择最优化方案,避免无谓的资源浪费。 #### 总结 基于索引的SQL语句优化是一个系统工程,涉及对数据库架构、查询逻辑、数据分布等多...

    数据库的索引分区

    - **空间代价**:虽然索引提高了查询速度,但它需要额外的磁盘空间来存储,并且在插入、删除和更新操作时会增加一定的开销。 #### 索引的维护 - **自动维护**:大多数现代数据库管理系统(如Oracle)能够在数据...

    Mysql索引数据结构.pptx

    B Tree 的高度较低,查找效率较高,适合用于磁盘存储,因为磁盘的读取操作在物理上代价较大,B Tree 能减少磁盘 I/O 次数。 4. **B+ Tree**:B+ Tree 是 B Tree 的变体,更适用于数据库索引。与 B Tree 不同,B+ ...

    MySQL索引_021

    - **时间代价**:虽然索引加快了查询,但插入、更新和删除操作可能需要维护索引,导致额外的时间成本。 了解了这些基础知识,我们将进一步探讨如何更有效地利用索引。在创建索引时,必须权衡其带来的性能提升与...

Global site tag (gtag.js) - Google Analytics