Python数据分析:数据库索引如何提高效率?
索引在数据库中是一个很特殊的存在,它的目的就是为了提高数据查询得效率。同样,它也有弊端,更新一个带索引的表的时间比更新一个没有带索引的时间更长。有得有失。我希望做一些研究测试,搞清楚索引对于我们使用数据库有什么影响,以及如何控制这个影响。
聚集索引和非聚集索引
聚集索引根据数据行的键值在表或视图中排序和存储这些数据行。索引定义中包含聚集索引列。每个表只能有一个聚集索引,因为数据行本身只能按一个顺序排序。只有当表包含聚集索引时,表中的数据行才按排序顺序存储。如果表具有聚集索引,则该表称为聚集表。如果表没有聚集索引,则其数据行存储在一个称为堆的无序结构中。
聚集索引特殊的方面是:聚集索引的叶级是实际的数据-也就是说,数据重新排序,按照和聚集索引排序条件声明的相同物理顺序存储。这意味着,一旦到达索引的叶级,就到达了数据。而非聚集索引,到达了叶级只是找到了数据的引用。因此聚集索引带来的空间消耗是需要额外的120%的空间。
任何新记录都根据聚集列正确的物理顺序插入到聚集索引中。创建新页的方式随需要插入记录的位置而变化。如果新记录需要插入到索引结构中间,就会发生正常的页拆分。来自旧页的后一半记录被移到新页,并且在适当的时候,将新记录插入到新页或旧页。如果新记录在逻辑上位于索引结构的末端,那么创建新页,但是只将新记录添加到新页。在MySQL中,聚集索引可以认为是唯一索引。
非聚集索引中的项目按索引键值的顺序存储,而表中的信息按另一种顺序存储(这可以由聚集索引规定)。对于非聚集索引,可以为在表非聚集索引中查找数据时常用的每个列创建一个非聚集索引。非聚集索引中的项目按索引键值的顺序存储,而表中的信息按另一种顺序存储(这可以由聚集索引规定)。对于非聚集索引,可以为在表非聚集索引中查找数据时常用的每个列创建一个非聚集索引。在MySQL中,费聚集
引用一下网上常见的使用聚集索引和非聚集索引的使用上的注意事项:
本文并非探索索引的数据结构以及不同数据库的索引区别,对于数据分析而言也不是很重要,关键是搞懂索引的作用、索引的区别以及怎样使用索引。
测试环境和数据
不介绍测试环境的探究都是耍流氓,下面介绍一下测试所使用的环境和数据。
机器是两台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语句包含对应聚集索引和非聚集索引的),但是也有细分,我这里进行详细的定义。
1. 插入操作
I1: 逐条插入,类似insert into student (ID, name,age,address) values(10000001,‘HE KEJUN’,28,’GUANGDONGG-GUANGZHOU’),每插入100条记录并记录耗时
I2:批量插入,即10次每次进行插入100条记录
2. 修改操作
U1:修改某个字段
U2:修改多个字段,每修改100条记录并记录耗时
3. 删除操作
D1:删除某条记录(含where语句),每删除100条记录并记录耗时。
4. 查询操作
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数据库,索引对于查询的耗时的降低是非常明显的。计划以后在百万级的数据表中再重新设计做一次实验再分享给大家。
End.
作者:柯君
来源:博客园
零基础学 Python(送价值109的视频课),来这里只需7天时间,跨进Python编程大门,已有3800+加入【基础】0基础入门python,24小时有人快速解答问题;
【提高】40多个项目实战,老手可以从真实场景中学习python;
【直播】不定期直播项目案例讲解,手把手教你如何分析项目;
【分享】优质python学习资料分享,让你在最短时间获得有价值的学习资源;圈友优质资料或学习分享,会不时给予赞赏支持,希望每个优质圈友既能赚回加入费用,也能快速成长,并享受分享与帮助他人的乐趣。
【人脉】收获一群志同道合的朋友,并且都是python从业者
【价格】本着布道思想,只需 69元 加入一个能保证学习效果的良心圈子。
【赠予】价值109元 0基础入门在线课程,免费送给圈友们,供巩固和系统化复习
Python数据分析:数据库索引如何提高效率?相关推荐
- 非索引查询如何提高效率_Python数据分析:数据库索引如何提高效率?
- 点击上方"中国统计网"订阅我吧!- 索引在数据库中是一个很特殊的存在,它的目的就是为了提高数据查询得效率.同样,它也有弊端,更新一个带索引的表的时间比更新一个没有带索引的时间更 ...
- python 提高文件查询效率_Python 大量小文件存储提高效率的简单示例
这篇文章主要为大家详细介绍了Python 大量小文件存储提高效率的简单示例,具有一定的参考价值,可以用来参考一下. 对python这个高级语言感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧 ...
- 数据库索引的创建以及常见优化
如何使用数据库索引 使用索引可快速访问数据库表中的特定信息.索引是对数据库表中一列或多列的值进行排序的一种结构.索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容. 什么是索引 数据 ...
- mysql数据库索引的科普
文章归属:http://feiyan.info/16.html 关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮 ...
- MySql数据库索引介绍
写在前面 数据库索引对我们来说是透明的,因为数据库表创建索引前后,SQL语句都可以正常运行,索引的运用只是数据库引擎工作时候的优化手段.但是,这并不是说数据库索引仅仅是数据库设计开发人员和运维人员的事 ...
- 数据库索引原理,及MySQL索引类型
原文:数据库索引原理,及MySQL索引类型 - weixin_42181824的博客 - CSDN博客 https://blog.csdn.net/weixin_42181824/article/d ...
- Python 数据分析三剑客之 NumPy(二):数组索引 / 切片 / 广播 / 拼接 / 分割
CSDN 课程推荐:<Python 数据分析与挖掘>,讲师刘顺祥,浙江工商大学统计学硕士,数据分析师,曾担任唯品会大数据部担任数据分析师一职,负责支付环节的数据分析业务.曾与联想.亨氏.网 ...
- python xlwings追加数据_大数据分析Python库xlwings提升Excel工作效率教程
原标题:大数据分析Python库xlwings提升Excel工作效率教程 Excel在当今的企业中非常非常普遍.在AAA教育,我们通常建议出于很多原因使用代码,并且我们的许多数据科学课程旨在教授数据分 ...
- python 编程提高效率_15 个提高效率的 Python 编程技巧
作者:George Seif 翻译:马可薇 来源:InfoQ 每次写 Python 都会忘记该怎么写,最后只能去 Stack Overflow 查?我也一样.时间一长,这让人厌倦. 这 15 个 Py ...
最新文章
- 《C#精彩实例教程》小组阅读08 -- C#流程控制语句
- Ubuntu16.04 Table无法自动补全
- Cookie和会话状态 (转)
- 程序员面试之MySQL数据库表的设计
- 安装翻译_【现象】面对日益增多的外国人 日本安装远程翻译设施
- netbeans7.4_NetBeans 7.4 Beta提示警告无效的异常处理
- 如何编写Java代理
- 什么是SFP光模块?SFP光模块小知识介绍!
- ueditor的配置和使用
- vue中多行文本标签_vue控制多行文字展开收起的实现示例
- 制造业数字化经营新思路:管理平台架构及三大落地方法论
- Linux下VsFTP和ProFTP用户管理高级技巧 之一
- flowchart流程图编程语言下载_c语言流程图生成器下载
- python入门教程汇总
- VS2008安装Qt4.8
- ANSI-美国国家标准学会
- linux安装完mysql没有服务_Linux中安装mysql之后 mysql服务不能启动
- 如何把苹果卖出高价?
- PS学习-制作下雨效果
- 已定义了两个整数变量A和B,完成下列功能: (1)若两个数中有一个是奇数,则将奇数存入A中,偶数存入B中(2)若两个数均为奇数,则将两数均加1后存入原变量(3)若两个数均为偶数,则两个变量均不改变。
热门文章
- Docker简介与安装
- 浮标水质监测站是什么
- 在java中画背景图片_JAVA如何添加背景图片?
- QT官网最新的往期版本下载链接
- 系统学习做汉堡_您如何学习策略设计模式? 做一个汉堡!
- 数理统计_正态分布经典例题
- 什么叫 Rss 订阅
- subprocess.CalledProcessError: Command '('lsb_release', '-a')' returned non-zero exit status 1.
- systemctl笔记221029
- 欧暇·地中海酒店深圳再布局 深圳国际会展中心和平店进入试营业