索引在数据库中是一个很特殊的存在,它的目的就是为了提高数据查询得效率。同样,它也有弊端,更新一个带索引的表的时间比更新一个没有带索引的时间更长。有得有失。我希望做一些研究测试,搞清楚索引对于我们使用数据库有什么影响,以及如何控制这个影响。

先简单介绍两个相对立的概念:聚集索引和非聚集索引。

聚集索引根据数据行的键值在表或视图中排序和存储这些数据行。索引定义中包含聚集索引列。每个表只能有一个聚集索引,因为数据行本身只能按一个顺序排序。只有当表包含聚集索引时,表中的数据行才按排序顺序存储。如果表具有聚集索引,则该表称为聚集表。如果表没有聚集索引,则其数据行存储在一个称为堆的无序结构中。聚集索引特殊的方面是:聚集索引的叶级是实际的数据-也就是说,数据重新排序,按照和聚集索引排序条件声明的相同物理顺序存储。这意味着一旦到达索引的叶级,就到达了数据。而非聚集索引,到达了叶级只是找到了数据的引用。因此聚集索引带来的空间消耗是需要额外的120%的空间。任何新记录都根据聚集列正确的物理顺序插入到聚集索引中。创建新页的方式随需要插入记录的位置而变化。如果新记录需要插入到索引结构中间,就会发生正常的页拆分。来自旧页的后一半记录被移到新页,并且在适当的时候,将新记录插入到新页或旧页。如果新记录在逻辑上位于索引结构的末端,那么创建新页,但是只将新记录添加到新页。在MySQL中,聚集索引可以认为是唯一索引。

非聚集索引中的项目按索引键值的顺序存储,而表中的信息按另一种顺序存储(这可以由聚集索引规定)。对于非聚集索引,可以为在表非聚集索引中查找数据时常用的每个列创建一个非聚集索引。非聚集索引中的项目按索引键值的顺序存储,而表中的信息按另一种顺序存储(这可以由聚集索引规定)。对于非聚集索引,可以为在表非聚集索引中查找数据时常用的每个列创建一个非聚集索引。在MySQL中,费聚集

引用一下网上常见的使用聚集索引和非聚集索引的使用上的注意事项:

本文并非探索索引的数据结构以及不同数据库的索引区别,对于数据分析而言也不是很重要,关键是搞懂索引的作用、索引的区别以及怎样使用索引。本文下面不再展开讨论索引的实现,对于索引结构及工作原理感兴趣的请看这篇文档http://www.cnblogs.com/kissdodog/archive/2013/06/12/3132380.html 。

测试环境和数据

不介绍测试环境的探究都是耍流氓,下面介绍一下测试所使用的环境和数据。

机器是两台IBM的PC,一台作为client,一台作为data server。PC的硬件是I5-4590CPU 3.3GHz+4GRAM(client),I7-4790 3.6GHZ+8GRAM(server)。client和server内网连接。client是win7 32位,server是win7 64位操作系统。

测试的数据库分别是MS SQLServer 2008R2版本 和 MySQL Server5.5版本。

分别再MySQL和SQLServer的测试数据库建了三个表student_no(无索引),student_in(有非聚集索引),student_cin(有聚集索引),表的字段都是一致的,参考下面的建表sql。

CREATE TABLE `student_xx` (`ID` int(11) NOT NULL,`name` varchar(10) NOT NULL,`age` int(3) NOT NULL,`address` varchar(10) NOT NULL
)

注意建表的过程中,我默认有几个设置,ID是所有数据都不一样的,是唯一标识符,name基本上所有人也不一样,age的数据比较一致在[20,30]这个区间,addres只记录所在省份城市的名字,数据范围在300个以内。

测试结果

测试使用的手段无非是对数据库的增删改查操作(where语句包含对应聚集索引和非聚集索引的),但是也有细分,我这里进行详细的定义。

插入操作:I1: 逐条插入,类似insert into student (ID, name,age,address) values(10000001,‘HE KEJUN’,28,’GUANGDONGG-GUANGZHOU’),每插入100条记录并记录耗时; I2:批量插入,即10次每次进行插入100条记录。

修改操作:U1:修改某个字段;U2:修改多个字段。每修改100条记录并记录耗时

删除操作:D1:删除某条记录(含where语句)。每删除100条记录并记录耗时。

查询操作:S1:查询数据;S2:查询中带有COUNT函数;S3查询中带有SUM函数;S4查询中带有ORDER BY。上述操作都是每查询1000条记录并记录耗时。

我们首先看看在小数量级的数据中索引的不同表现。

在小数据集(数据表记录数=10000)的情况下,各个数据库操作的耗时如下:

  MSSQL MYSQL
  无索引 非聚集索引 聚集索引 无索引 非聚集索引 聚集索引
I1 0.80935 0.81045 0.8031 1.07525 0.782 0.79005
I2 2.1868 2.1891 2.13555 0.15565 0.1688 0.1478
D1 0.95685 0.60885 0.7253 0.9924 0.50565 0.748
U1 0.9642 0.78035 0.7368 0.85725 0.8601 0.78205
U2 0.8759 0.74055 0.70125 0.83575 0.53745 0.7721
S1 3.2293 2.5016 1.92195 9.2856 2.22845 1.85555
S2 2.963 2.051 2.0203 9.39085 2.2397 2.62835
S3 3.1109 2.7788 2.0137 9.38075 2.26215 2.74975
S4 9.6427 9.6553 7.2891 10.2789 5.9647 4.9492

在MS SQLSever中:索引不会明显影响数据库进行插入和删除操作。在大多数情况下,聚集索引的效率都比非聚集索引的高。即聚集索引在小规模数量级的数据表中是最佳选择。

同样的情况出现在MySQL数据库。

索引对于查询的耗时的降低是非常明显的。

计划在百万级的数据表中再重新设计做一次实验。

转载于:https://www.cnblogs.com/kendrick/p/5266097.html

基于Python的数据分析:数据库索引效率探究相关推荐

  1. 基于python的数据分析系统,python数据分析经典案例

    大家好,本文将围绕利用python进行数据分析案例展开说明,基于python的数据分析系统是一个很多人都想弄明白的事情,想搞清楚基于python的数据分析题目需要先了解以下几个事情. 1.如何利用py ...

  2. 基于python的房地产数据分析_基于Python的数据分析

    转载 | CSDN 编辑 | 雷课小雷 下面来介绍一下基于Python的数据分析,主要介绍数据分析的概念.数据分析流程.Python优势.常用模块的用途以及使用Python进行数据分析的学习方法及步骤 ...

  3. 基于Python的数据分析系统的设计和实现

    <基于Python的数据分析系统的设计和实现>该项目采用技术Python的django框架.mysql数据库 ,项目含有源码.论文.PPT.配套开发软件.软件安装教程.项目发布教程.核心代 ...

  4. 毕设设计之 ---基于python大数据分析的北上广住房数据分析

    文章目录 前言 分析展示 一.北上广租房房源分布可视化 二.北上广内区域租金分布可视化 三.房源距地铁口租金的关系可视化 四.房屋大小与租金关系可视化 结论 租个人房源好还是公寓好 北上广深租房时都看 ...

  5. 基于python的可视化分析_基于Python 的数据分析与可视化平台研究

    基于 Python 的数据分析与可视化平台研究 宋永生 ; 黄蓉美 ; 王军 [期刊名称] <现代信息科技> [年 ( 卷 ), 期] 2019(003)021 [摘要] 数据分析与可视化 ...

  6. 基于python的房地产数据分析_基于Python的数据分析实战项目

    本文中项目资料来源于网易云课堂,代码为纯手工码字滴,请放心食用,不定期更新,欢迎对Python.数据分析以及编程感兴趣的同学留言沟通. 详细介绍了数十个数据分析相关的实战项目,大量使用pandas.n ...

  7. 基于python的数据分析毕业设计-基于python的Web大数据采集和数据分析

    肖乐 丛天伟 严卫 摘要:该设计使用python语言作为开发语言,主要采用了两个框架:Scrapy和Django,用Scrapy来实现数据的采集技术,让数据采集效率更高,错误率低等:用Django来实 ...

  8. 基于python和MySQL数据库开发应用程序:学生信息成绩管理系统1.0版本

    目录: 前言 一,需求分析 二,前期准备 三,编写代码 1.app.py 2.__init__.py 3.models.py 四,功能描述 1.界面展示 2.系统流程图介绍 3.功能介绍 系统优缺点 ...

  9. 基于Python 大数据分析的网络舆情系统设计与实现

    基于Python的网络舆情系统设计与实现 源码获取:https://www.bilibili.com/video/BV1Ne4y1g7dC/ 系统主要就是针对手机行业文章进行抓取并分析统计,根据用户定 ...

最新文章

  1. python在windows下操作word的方法的代码
  2. [转]孙鑫VC教程例子代码1---Windows程序内部运行原理
  3. swoole 异步redis
  4. UNICODE转多字节
  5. Python小练习:批量删除多个文件夹内的相同文件
  6. Oracle 数据库创建表空间、创建用户指定表空间
  7. linux hook 任意内核函数,【求助】Kernel 4.8下编译编写的Netfilter Hook函数失败
  8. ssm-学子商城-项目第五天
  9. 基于DEM数据的河流提取
  10. 我java启蒙老师 郝斌老师
  11. 如何下载macOS Ventura、Monterey、Big Sur、Catalina Mojave完整安装程序
  12. 数据开发常用的几种数据预处理和数据整理方法
  13. K8S标签和污点容忍
  14. HTML5中的全局属性
  15. C++ 第一阶段编程练习
  16. 数据库SQL实战 --42.将id=5以及emp_no=10001的行数据替换成id=5以及emp_no=10005
  17. 原生js.ajax内存溢出,【JS】解决内存溢出问题
  18. 为什么ad域打开失败_【AD】域环境常见错误集
  19. 天津市第三中心医院院长杜智:患者医药费超标 罚医生护士
  20. 借助PD4ML将HTML转化成RTF或者PDF

热门文章

  1. 机器学习实验 - 朴素贝叶斯分类器
  2. 字字珠玑的百度员工离职总结
  3. android触摸震动原理
  4. jQuery显示隐藏
  5. Gateway网关下载启动
  6. 用一分钟理解console的这个原理,多留几根黑发~
  7. linux mv覆盖目录,linux下利用grep和dd命令恢复被mv命令覆盖的文件内容
  8. 史上最全的Android面试题集锦,大厂内部资料
  9. 【一段代码可以进行哪些优化?】
  10. 面向对象设计的六大原则