索引的好处

索引带来的益处可能很多读者会认为只是"能够提高数据检索的效率,降低数据库的IO成本"。

确实,在数据库中表的某个字段创建索引,所带来的最大益处就是将该字段作为检索条件时可以极大地提高检索效率,加快检索时间,降低检索过程中须要读取的数据量。但是索引带来的收益只是提高表数据的检索效率吗?当然不是,索引还有一个非常重要的用途,那就是降低数据的排序成本。

我们知道,每个索引中的数据都是按照索引键键值进行排序后存放的,所以,当Query 语句中包含排序分组操作时,如果排序字段和索引键字段刚好一致,MySQL Query Optimizer 就会告诉 mysqld 在取得数据后不用排序了,因为根据索引取得的数据已经满足客户的排序要求。

那如果是分组操作呢?分组操作没办法直接利用索引完成。但是分组操作是须要先进行排序然后分组的,所以当Query 语句中包含分组操作,而且分组字段也刚好和索引键字段一致,那么mysqld 同样可以利用索引已经排好序的这个特性,省略掉分组中的排序操作。

排序分组操作主要消耗的是内存和 CPU 资源,如果能够在进行排序分组操作中利用好索引,将会极大地降低CPU资源的消耗。

索引的弊端

索引的益处已经清楚了,但是我们不能只看到这些益处,并认为索引是解决 Query 优化的圣经,只要发现 Query 运行不够快就将 WHERE 子句中的条件全部放在索引中是错误的。

确实,索引能够极大地提高数据检索效率,也能够改善排序分组操作的性能,但有不能忽略的一个问题就是索引是完全独立于基础数据之外的一部分数据。假 设在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 Query Optimizer 大多数时候也不会去选择使用,如果什么时候 MySQL Query Optimizer选择了这种索引,那么非常遗憾地告诉你,这可能会带来极大的性能问题。由于索引字段中每个值都含有大量的记录,那么存储引擎在根据索引 访问数据的时候会带来大量的随机IO,甚至有些时候还会出现大量的重复IO。

比如说,一张表中有60%的记录的age字段等于20,给这个字段建立索引,查询age等于20的记录,因为唯一性太差了,可能会带来极大的性能问题。

这主要是由于数据基于索引扫描的特点引起的。当我们通过索引访问表中数据时,MySQL 会按照索引键的键值顺序来依序访问。一般来说,每个数据页中大都会存放多条记录,但是这些记录可能大多数都不会和你所使用的索引键的键值顺序一致。

为什么重复值高的字段不适合单独创建索引?

因为非聚集索引的字段值如果重复率高,这些记录很可能会被放在不同的数据页(可以想象为很多逻辑位置),根据索引去查找这些不同数据页的记录,花费的时间可能不亚于全表扫描,而且索引占了很多内存,更新也要修改。

什么是数据页?

数据页是InnoDB存储引擎管理数据库的最小磁盘单位。页类型为B-tree node的页,存放的即是表中行的实际数据了。

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

上面在索引的弊端中已经分析过了,索引中的字段被更新的时候,不仅要更新表中的数据,还要更新索引数据,以确保索引信息是准确的。这个问题致使IO 访问量较大增加,不仅仅影响了更新 Query 的响应时间,还影响了整个存储系统的资源消耗,加大了整个存储系统的负载。

当然,并不是存在更新的字段就适合创建索引,从判定策略的用语上也可以看出,是"非常频繁"的字段。到底什么样的更新频率应该算是"非常频繁"呢? 每秒?每分钟?还是每小时呢?说实话,还真难定义。很多时候是通过比较同一时间段内被更新的次数和利用该字段作为条件的查询次数来判断的,如果通过该字段 的查询并不是很多,可能几个小时或是更长才会执行一次,更新反而比查询更频繁,那这样的字段肯定不适合创建索引。

总的来说,索引虽好,也不要随意创建索引,索引使用不当还会影响效率!

聚集索引到底是什么?

如果不创建索引,系统会自动创建一个隐含列作为表的聚集索引,逻辑存储与物理顺序相同。如主键创建的索引。

非聚集索引

非聚集索引,分成普通索引,唯一索引,全文索引;逻辑存储与物理顺序不同;所以,像我们平常手动创建的普通索引就是非聚集索引。如非主键创建的索引。

mysql 索引 数据页_数据库索引数据页相关推荐

  1. mysql的索引的作用_数据库索引的作用,优点和缺点

    为什么要创建索引呢?这是因为,创建索引可以大大提高系统的性能. 第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性. 第二,可以大大加快 数据的检索速度,这也是创建索引的最主要的原因. 第 ...

  2. 如何设计mysql的表结构_数据库的数据表的结构是如何设计的?

    1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体.在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证对 ...

  3. 数据库mysql的索引_数据库索引

    数据库索引 编辑 锁定 索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息.如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信 ...

  4. B-树和B+树的应用:数据搜索和数据库索引

    http://blog.csdn.net/hguisu/article/details/7786014 http://blog.csdn.net/xlgen157387/article/details ...

  5. 高度为5的3阶b树含有的关键字个数_B-树和B+树的应用:数据搜索和数据库索引...

    B-树 1 .B-树定义:有序数组+平衡多叉树 B-树是一种平衡的多路查找树,它在文件系统中很有用. 定义:一棵m 阶的B-树,或者为空树,或为满足下列特性的m 叉树: ⑴树中每个结点至多有m 棵子树 ...

  6. mysql下备份所有的数据库和数据表

    shell脚本实现 mysql下备份所有的数据库和数据表 要求:(1)mysql下的数据库的表要以table_name.sql备份保存 (2)保存在当前目录下,并以当天时间命名 #!/bin/bash ...

  7. excel导入数据校验_使用Excel数据验证限制日期范围

    excel导入数据校验 Yesterday, one of my clients emailed to let me know that she was having trouble entering ...

  8. 深度学习数据自动编码器_如何学习数据科学编码

    深度学习数据自动编码器 意见 (Opinion) When I first wanted to learn programming, I coded along to a 4 hour long Yo ...

  9. hive能加快MySQL查询速度吗_建立索引可以加快表中数据查询的速度吗

    首先明白为什么索引会增加速度,DB在执行一条Sql语句的时候,默认的方式是根据搜索条件进行全表扫描,遇到匹配条件的就加入搜索结果集合. 如果我们对某一字段增加索引,查询时就会先去索引列表中一次定位到特 ...

最新文章

  1. linux的网络地址配置,教你如何完成Linux网络地址配置
  2. C#机房重构-datagridview控件的使用
  3. 【零基础入门数据挖掘】-特征工程
  4. extjs中元数据_json – 如何配置ExtJS 4 Store(代理和阅读器)来读取元数据
  5. adb概览及协议參考
  6. Typescript 类型的常用知识与技能
  7. Windows 7 SP1 多国语言包(MUI language packs)官方下载
  8. 戴尔dell电脑恢复出厂设置教程(BIOS恢复出厂设置,新版台式机)
  9. PMP-8. 项目经理的能力
  10. 织梦DedeCMS列表页给推荐的文章添加推荐特荐图标
  11. @submit.native.prevent作用
  12. Ambarella S6L55M 性能测试之内存篇
  13. 使用FFMPEG将WebM转为MP4或MKV
  14. 解构金蝶EAS 开发工具
  15. 计算机wps文字基础知识,计算机一级考试WPS基础练习题(含答案)
  16. 机器学习如何驱动业务实践?你想知道的都在这!
  17. anchor base和anchor free, 小物体检测, YOLO V1-3 9000 V4 V5 的区别,yolov5-8, yolox创新点
  18. shareSDK 微信分享闪退问题
  19. PHP全栈学习笔记29
  20. 单片机通信——spi、iic、uart

热门文章

  1. 用IT技术玩金融系列文章
  2. BestCoder Round #90 Kblack loves flag
  3. 在系统可编程器件一般使用计算机,eda技术与vhdl复习练习题.docx
  4. java中接口可以产生数组吗,java接口Array介绍
  5. IDEIDEA 如何搭建maven 安装、下载、配置A 如何搭建maven 安装、下载、配置
  6. android判断密码字符串,逆向分析苏宁易购安卓客户端加密到解密获取明文密码(附demo验证) | WooYun...
  7. java+lambda+本质_Java8 Lambda本质论
  8. vi vim 使用方法
  9. web页面的回流,认识与避免
  10. ajax跨域,json,jsonp