专注于WEB技术的IT博客

mysql中索引的利弊及需求分析

时间:2014-02-26分类: Mysql浏览:2889
分享到:

索引,可以说是数据库相关优化尤其是在Query 优化中最常用的优化手段之一了,虽然如此,但索引也并非是解决query优化的圣经,不能只要发现Query 运行不够快就将where子句中的条件全部放在索引中。什么事都是适而可止,过犹不及,一起来看过究竟吧。


索引的利处

索引能够提高数据检索的效率,降低数据库的IO 成本和排序成本。在数据库中个表的某个字段创建索引,所带来的最大益处就是将该字段作为检索条件的时候 可以极大的提高检索效率,加快检索时间,降低检索过程中所需要读取的数据量。


索引不是多多益善

索引能够极大的提高数据检索效率,也能够改善排序分组操作的性能,但是我们不能忽略的 一个问题就是索引是完全独立于基础数据之外的一部分数据。假设我们在Table ta 中的Column ca 创 建了索引idx_ta_ca,那么任何更新Column ca 的操作,MySQL 都需要在更新表中Column ca 的同时, 也更新Column ca 的索引数据,调整因为更新所带来键值变化后的索引信息。而如果我们没有对 Column ca 进行索引的话,MySQL 所需要做的仅仅只是更新表中Column ca 的信息。这样,所带来的最 明显的资源消耗就是增加了更新所带来的IO 量和调整索引所致的计算量。此外,Column ca 的索引 idx_ta_ca 是需要占用存储空间的,而且随着Table ta 数据量的增长,idx_ta_ca 所占用的空间也会 不断增长。所以索引还会带来存储空间资源消耗的增长。


如何判定是否需要创建索引


较频繁的作为查询条件的字段应该创建索引;

索引正是我们减少通过索引键字段作为查询条件的Query的IO 量的最有效手段。


唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件;

唯一性太差的字段,如状态字段,类型字段等。因为mysql首先会将索引中的键值取出来与内存中存储表数据的页中的数据相比较,但是数据页中的数据的顺序和索引队列中键值的顺序并不是一致的。假如索引中的键值a先在数据页x中找到了符合的数据,然后又在数据页y中找到了符合条件的数据,这时mysql便会把数据页x销毁掉,把数据页Y读到内存中。如果这时候还有键值b,然后键值b找的数据又在数据页x上,则mysql又要把数据页x读到内存中。也就是说从索引去寻找对应的表数据的时候是随机访问的。(实际情况应该是内存中缓存了好几页的数据,应该不只一页,但是这里假定线程内存中只存在一张页表)。这样的随机访问所造成的io消耗是比全表扫描的io消耗来得大的。(还不如遍历整张表)

假如索引字段唯一性好的话,比如是唯一的,则最多只需要换一次页表。

假如索引字段唯一性差的话,需要进行的换页次数也就相应的提高了。


更新非常频繁的字段不适合创建索引;

索引中的字段被更新的时候,不仅仅需要更新表中的 数据,同时还要更新索引数据,以确保索引信息是准确的。这个问题所带来的是IO 访问量的较大 增加,不仅仅影响更新Query 的响应时间,还会影响整个存储系统的资源消耗,加大整个存储系统 的负载。当然,并不是存在更新的字段就不适合创建索引,从上面判定策略的用语上面也可以看出,是 “非常频繁”的字段。


会出现在WHERE 子句中的字段不该创建索引;


索引给Query优化带来好处,但我们也不忽略它的憋端,可以说是利憋参半,需要根据实际应用把握好适度。


猜你喜欢
标签 : mysql
除非注明,本文首发网志博客,欢迎转载!转载请注明本文地址:http://w3note.com/web/142.html,谢谢。
  • 评论
  • 赞助本站