`
王之子
  • 浏览: 104977 次
  • 性别: 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
分享到:
评论

相关推荐

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

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

    MySQL数据库:索引概述.pptx

    表里面的记录数量越多,这个操作的代价就越高。 索引提供指针以指向存储在表中指定列的数据值,然后根据指定的排序次序排列这些指针。数据库使用索引的方式与使用书的目录很相似:通过搜索索引找到特定的值,然后...

    SQL Server 索引基础知识

    整理了一下郭红俊大哥的关于SQL索引的10篇基础知识,转为PDF文1.记录数据的基本格式 ...6.索引的代价,使用场景 7.Indexing for AND 8.数据基本格式补充 9.Indexing for OR 10.Joins 时的三种算法简介档,方便查询.

    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_...

    Oracle索引组织表

    索引组织表(IOT)不仅可以存储数据,还可以存储为表建立的索引。索引组 织表的数据是根据主键排序后的顺序进行排列的,这样就提高了...但是这是由牺牲插入和更新性能为代价的(每次写入和更新后都要重新进行重 新排序)

    SQL Server索引基础知识.pdf

    自己制作的pdf,目录包括如下: <br>记录数据的基本格式 3 聚集索引,非聚集索引 8 测试中常看指标和清除缓存方法 15 主键与聚集索引 18 理解newid()和newsequentialid() 20 索引的代价,使用场景 ...

    一种基于频繁子树的数据库索引方法

    为解决带标号的有根无序树的数据库的索引问题, 提出一种新的索引方法, 首先挖掘频繁子树,并...实验结果表明:与其他基于路径的索引方法相比, 这种基于频繁子树的数据库索引在索引大小和查询代价两 方面都有较好的优越性.

    论文研究-MapReduce框架下基于B树的高维索引.pdf

    针对MapReduce数据块处理机制、高维数据分布特征和KNN查询...利用B 树构造分布式的双层索引实现查询时数据范围快速过滤,降低高维计算代价。实验表明,iPartition在高维数据近似查询环境下,具有良好的性能和扩展性。

    论文研究-一种支持多维区间查询的云对等网络索引架构.pdf

    针对用户在大规模云对等网络环境下多维区间查询问题,将基于m叉平衡树的索引架构引入到云对等网络环境下,在该架构上实现集中式环境下支持多维数据索引的层次化树结构,如R树、QR树。多维区间查询算法保证查询从树的...

    论文研究-ATPR-Tree:带有属性维的时空索引.pdf

    城市计算领域里所处理的移动对象往往带有除时间、空间信息外更多的信息,而目前的移动对象索引大多只有时间、空间这两个维度,不能有效地对附带更多信息的移动对象进行管理。基于这一问题,提出了一种带有属性维度的...

    数据库索引的实现原理

     为表设置索引要付出代价的:一是增加了数据库的存储空间,二是在插入和修改数据时要花费较多的时间(因为索引也要随之变动)。  上图展示了一种可能的索引方式。左边是数据表,一共有两列七条记录,左边的是...

    pp7221343#Interview-preparation#2021-3-18mysql索引不生效情况1

    如果能使用索引,MySQL会使用索引,如果代价太高,仍然会走全表索引如果多个OR条件中有其中一个条件没有索引,则必须进行全表索引联合索引(a,b,c)联合索引使

    MySQL索引特性

    但是天下没有免费的午餐,查询速度的提高是以插入、更 新、删除的速度为代价的,这些写操作,增加了大量的IO。所以它的价值,在于提高一个海量数据的检索速度。 常见索引分为: 主键索引(primary key) 唯一索引...

    MySQL数据库优化之索引实现原理与用法分析

    表里面的记录数量越多,这个操作的代价就越高。如果作为搜索条件的列上已经创建了索引,MySQL无需扫描任何记录即可迅速得到目标记录所在的位置。如果表有1000个记录,通过索引查找记录至少要比顺序扫描记录快100倍。...

    论文研究-基于动态文档集的索引技术.pdf

    倒排文件是全文检索中广泛使用的索引结构,对静态文档集合建立倒排索引的研究已有较长时间。随着计算机技术的发展,需要存储的数据越来越大。...描述了常用的动态索引技术,并详细分析了其使用代价。

    论文研究-基于压缩全文索引的演变图查询.pdf

    当需要对其进行多次查询时,每次遍历整个演变图将带来非常高的查询代价,而现有的基于枚举的哈希索引算法又使得预处理过程拥有相当大的时间和空间开销,为了减少对大规模演变图的预处理代价,将压缩的全文索引技术...

    oracle 索引组织表的深入详解

    但是这是由牺牲插入和更新性能为代价的(每次写入和更新后都要重新进行重新排序)。索引组织表的创建格式如下: 代码如下:create table indexTable( ID varchar2 (10), NAME varchar2 (20), constraint pk_id ...

    时间序列数据库的秘密(二)——索引

    当我们不需要支持快速的更新的时候,可以用预先排序等方式换取更小的存储空间,更快的检索速度等好处,其代价就是更新慢。要进一步深入的化,还是要看一下Lucene的倒排索引是怎么构成的。这里有好几个概念。我们来看...

    详解SQL Server的聚焦过滤索引

    过滤索引是SQL 2008的新特性,被应用在表中的部分行,所以利用过滤索引能够提高查询,相对于全表扫描它能减少索引维护和索引存储的代价。当我们在索引上应用WHERE条件时就是过滤索引。也就是满足如下格式: CREATE ...

    11 索引与散列1

    1. 保持空间的使用效率 2. 每次重组只作用于一个桶,性能开销比较低 1. 索引或散列组织的周期性重组代价是否可以接受 2. 插入和删除的相对频率如何 3.

Global site tag (gtag.js) - Google Analytics