MySQL学习笔记(23)-----------索引优化

原创 2015年07月07日 11:04:37

大家都知道索引对于数据访问的性能有非常关键的作用,都知道索引可以提高数据访问效率。

为什么索引能提高数据访问性能?他会不会有“副作用”?是不是索引创建越多,性能就越好?到底该如何设计索引,才能最大限度的发挥其效能?

这篇文章主要是带着上面这几个问题来做一个简要的分析,同时排除了业务场景所带来的特殊性,请不要纠结业务场景的影响。

索引为什么能提高数据访问性能?

很多人只知道索引能够提高数据库的性能,但并不是特别了解其原理,其实我们可以用一个生活中的示例来理解。

我们让一位不太懂计算机的朋友去图书馆确认一本叫做《MySQL性能调优与架构设计》的书是否在藏,这样对他说:“请帮我借一本计算机类的数据库书籍,是属于 MySQL 数据库范畴的,叫做《MySQL性能调优与架构设计》”。朋友会根据所属类别,前往存放“计算机”书籍区域的书架,然后再寻找“数据库”类存放位置,再找到一堆讲述“MySQL”的书籍,最后可能发现目标在藏(也可能已经借出不在书架上)。

在这个过程中: “计算机”->“数据库”->“MySQL”->“在藏”->《MySQL性能调优与架构设计》其实就是一个“根据索引查找数据”的典型案例,“计算机”->“数据库”->“MySQL”->“在藏” 就是朋友查找书籍的索引。

假设没有这个索引,那查找这本书的过程会变成怎样呢?朋友只能从图书馆入口一个书架一个书架的“遍历”,直到找到《MySQL性能调优与架构设计》这本书为止。如果幸运,可能在第一个书架就找到。但如果不幸呢,那就惨了,可能要将整个图书馆所有的书架都找一遍才能找到我们想要的这本书。

注:这个例子中的“索引”是记录在朋友大脑中的,实际上,每个图书馆都会有一个非常全的实际存在的索引系统(大多位于入口显眼处),由很多个贴上了明显标签的小抽屉构成。这个索引系统中存放这非常齐全详尽的索引数据,标识出我们需要查找的“目标”在某个区域的某个书架上。而且每当有新的书籍入库,旧的书籍销毁以及书记信息修改,都需要对索引系统进行及时的修正。

下面我们通过上面这个生活中的小示例,来分析一下索引,看看能的出哪些结论?

索引有哪些“副作用”?

  1. 图书的变更(增,删,改)都需要修订索引,索引存在额外的维护成本
  2. 查找翻阅索引系统需要消耗时间,索引存在额外的访问成本
  3. 这个索引系统需要一个地方来存放,索引存在额外的空间成本

索引是不是越多越好?

  1. 如果我们的这个图书馆只是一个进出中转站,里面的新书进来后很快就会转发去其他图书馆而从这个馆藏中“清除”,那我们的索引就只会不断的修改,而很少会被用来查找图书
    所以,对于类似于这样的存在非常大更新量的数据,索引的维护成本会非常高,如果其检索需求很少,而且对检索效率并没有非常高的要求的时候,我们并不建议创建索引,或者是尽量减少索引。
  2. 如果我们的书籍量少到只有几本或者就只有一个书架,索引并不会带来什么作用,甚至可能还会浪费一些查找索引所花费的时间。
    所以,对于数据量极小到通过索引检索还不如直接遍历来得快的数据,也并不适合使用索引。
  3. 如果我们的图书馆只有一个10平方的面积,现在连放书架都已经非常拥挤,而且馆藏还在不断增加,我们还能考虑创建索引吗?
    所以,当我们连存储基础数据的空间都捉襟见肘的时候,我们也应该尽量减少低效或者是去除索引。

索引该如何设计才高效?

  1. 如果我们仅仅只是这样告诉对方的:“帮我确认一本数据库类别的讲述 MySQL 的叫做《MySQL性能调优与架构设计》的书是否在藏”,结果又会如何呢?朋友只能一个大类区域一个大类区域的去寻找“数据库”类别,然后再找到 “MySQL”范畴,再看到我们所需是否在藏。由于我们少说了一个“计算机类”,朋友就必须到每一个大类去寻找。
    所以,我们应该尽量让查找条件尽可能多的在索引中,尽可能通过索引完成所有过滤,回表只是取出额外的数据字段。
  2. 如果我们是这样说的:“帮我确认一本讲述 MySQL 的数据库范畴的计算机丛书,叫做《MySQL性能调优与架构设计》,看是否在藏”。如果这位朋友并不知道计算机是一个大类,也不知道数据库属于计算机大类,那这位朋友就悲剧了。首先他得遍历每个类别确认“MySQL”存在于哪些类别中,然后从包含 “MySQL” 书籍中再看有哪些是“数据库”范畴的(有可能部分是讲述PHP或者其他开发语言的),然后再排除非计算机类的(虽然可能并没有必要),然后才能确认。
    所以,字段的顺序对组合索引效率有至关重要的作用,过滤效果越好的字段需要更靠前。
  3. 如果我们还有这样一个需求(虽然基本不可能):“帮我将图书馆中所有的计算机图书借来”。朋友如果通过索引来找,每次都到索引柜找到计算机书籍所在的区域,然后从书架上搬下一格(假设只能以一格为单位从书架上取下,类比数据库中以block/page为单位读取),取出第一本,然后再从索引柜找到计算机图书所在区域,再搬下一格,取出一本… 如此往复直至取完所有的书。如果他不通过索引来找又会怎样呢?他需要从地一个书架一直往后找,当找到计算机的书,搬下一格,取出所有计算机的书,再往后,直至所有书架全部看一遍。在这个过程中,如果计算机类书籍较多,通过索引来取所花费的时间很可能要大于直接遍历,因为不断往复的索引翻阅所消耗的时间会非常长。(延伸阅读:这里有一篇以前写的关于Oracle的文章,索引扫描还是全表扫描(Index Scan Or Full Table Scan)
    所以,当我们需要读取的数据量占整个数据量的比例较大抑或者说索引的过滤效果并不是太好的时候,使用索引并不一定优于全表扫描。
  4. 如果我们的朋友不知道“数据库”这个类别可以属于“计算机”这个大类,抑或者图书馆的索引系统中这两个类别属性并没有关联关系,又会怎样呢?也就是说,朋友得到的是2个独立的索引,一个是告知“计算机”这个大类所在的区域,一个是“数据库”这个小类所在的区域(很可能是多个区域),那么他只能二者选其一来搜索我的需求。即使朋友可以分别通过2个索引检索然后自己在脑中取交集再找,那这样的效率实际过程中也会比较低下。
    所以,在实际使用过程中,一次数据访问一般只能利用到1个索引,这一点在索引创建过程中一定要注意,不是说一条SQL语句中Where子句里面每个条件都有索引能对应上就可以了。

看完这些分析,我想大家应该了解索引优化的一些基本思路了吧 :)

版权声明:本人博客,供大家分享学习,有需要的话,可以转载!

Mysql数据库优化系列(五)------索引优化策略之面试题

实验: Type:range   此处使用上了范围索引 Key_len:12/3=4列 使用到了索引c1,c2,c3,c4.解析:因为order by c3是有序的,所以c3,c4也用到了索引 ...
  • wuming19900801
  • wuming19900801
  • 2014年12月27日 17:23
  • 1273

Mysql索引及优化使用总结

在关系数据库中,索引的使用十分重要,而且所有的关系数据库支持索引机制,因为有了索引之后,在大数据量检索数据时速度很快,性能消耗很低;当然,凡事有利必有弊,增加索引也会增加数据库系统的开销,我们很多时候...
  • why_2012_gogo
  • why_2012_gogo
  • 2016年03月26日 22:23
  • 2126

MySQL性能调优——索引详解与索引的优化

——索引优化,可以说是数据库相关优化、理解尤其是查询优化中最常用的优化手段之一。所以,只有深入索引的实现原理、存储方式、不同索引间区别,才能设计或使用最优的索引,最大幅度的提升查询效率! 一、BT...
  • zhangliangzi
  • zhangliangzi
  • 2016年05月11日 11:39
  • 12127

MySQL的索引单表优化案例分析

建表 建立本次优化案例中所需的数据库及数据表 CREATE DATABASE db0206; USE db0206;CREATE TABLE `db0206`.`article`( `id` ...
  • github_36379934
  • github_36379934
  • 2017年02月08日 12:13
  • 523

一次 MySQL 索引优化的经历

项目背景:一个类似云盘的工具,主服务器上的 MySQL(InnoDB 引擎) 存储文件 MD5 值,客户端需要在主服务器上查询文件的 MD5 来获取文件所在服务器的 IP 和文件路径。 问题:在...
  • wwh578867817
  • wwh578867817
  • 2016年03月02日 14:41
  • 1634

mysql 索引 优化 面试

mysql 索引 优化 面试题目: 问如何优化下面的Mysql SQL语句? select * from employee where employee.deptName in ( "depart...
  • bigtree_3721
  • bigtree_3721
  • 2017年05月18日 17:37
  • 603

mysql索引优化面试题

今天被面试到一个mysql索引的问题,没答出来。看了下文后,应该是用复合索引。本文转自:http://www.cnblogs.com/hephec/p/4557053.html建设数据库的优化大概主要...
  • xummgg
  • xummgg
  • 2016年11月06日 20:51
  • 630

MYSQL优化实践

开源数据库MySQL比较容易碰到性能瓶颈,为此经常需要对MySQL数据库进行优化,而MySQL数据库优化需要运维DBA与相关开发共同参与,其中MySQL参数及服务器配置优化主要由运维DBA完成,开发则...
  • gua___gua
  • gua___gua
  • 2016年08月12日 09:23
  • 428

MySQL 索引及查询优化

1. MySQL索引的原理 1.1 索引目的 索引的目的在于提高查询效率,可以类比字典,如果要查“mysql”这个单词,我们肯定需要定位到m字母,然后从下往下找到y字母,再找到剩下的sql...
  • ltx06
  • ltx06
  • 2016年07月14日 18:14
  • 301

MYSQL [ 优化 --- 分区 ]

MySQL分区概述  在MySQL中,InnoDB存储引擎长期支持表空间的概念,并且MySQL服务器甚至在分区引入之前,就能配置为存储不同的数据库使用不同的 物理路径。分区(partion)更进一步,...
  • jesseshen
  • jesseshen
  • 2011年07月28日 19:48
  • 2696
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MySQL学习笔记(23)-----------索引优化
举报原因:
原因补充:

(最多只允许输入30个字)