Mysql使用中的性能优化——索引对插入操作的性能影响

当我们往表中插入数据时,如果表中有索引,则会给插入操作增加更多的工作量。带来的好处是可以提升查询效率。但是这种优劣该如何权衡,则需要通过数据对比来提供佐证。本文我们将对比没有索引、有一个普通索引、有一个唯一索引的性能差距。

结论

  • 在只有一个索引(无论普通索引还是唯一索引)和无索引时性能差距不大。(在千万级数据量时,性能差距不超过一倍)。
  • 有无索引会随着数据量增加,性能差异也会随之增加。(下面三条线中,有索引的线的斜率要大于无索引的线,所以随着数据量增加,性能差距也会增加)

实验数据

在这里插入图片描述
上图中,“无索引”是指导入目标表没有索引;“普通索引”是指导入目标表只有一个普通索引;“唯一索引”是指导入目标表只有一个唯一索引。
可以看到在当前测试场景下,“普通索引”和“唯一索引”的性能接近。
“无索引”和“有索引”都是呈线性变化,即不会因为数量增加,每个方案会变得更加糟糕。(比如指数型变化,那就意味着更加糟糕)
有无索引的性能差异会随着数据量增加而增加,因为两者斜率不同,即喇叭口会越来越大。

测试环境

见《Mysql使用中的性能优化——搭建Mysql的监测服务》

测试方法解读

上图中无索引表结构

DROP TABLE IF EXISTS test_insert_no_index;
CREATE TABLE test_insert_no_index (id SERIAL PRIMARY KEY,name TEXT
) engine=InnoDB;

有普通索引表结构

CREATE TABLE test_insert_normal_index (id SERIAL PRIMARY KEY,name TEXT,INDEX name_index (name(32))
) engine=InnoDB;

有唯一索引表结构

CREATE TABLE test_insert_unique_index (id SERIAL PRIMARY KEY,name TEXT,UNIQUE INDEX name_index (name(32))
) engine=InnoDB;

然后使用类似下面的指令进行差距插入

INSERT INTO test_insert_normal_index (SELECT * FROM test_insert_src LIMIT 1000000);

完整测试代码

-- 通过从其他表中读取数据源,写入到目标表中,测试索引的比较操作
DROP DATABASE IF EXISTS testdb;
CREATE DATABASE IF NOT EXISTS testdb;
USE testdb;DROP TABLE IF EXISTS test_insert_src;
CREATE TABLE test_insert_src (id SERIAL PRIMARY KEY,name TEXT
) engine=InnoDB;DROP PROCEDURE IF EXISTS test_insert_proc_batch_bulk;
DELIMITER //
CREATE PROCEDURE test_insert_proc_batch_bulk(IN name TEXT, IN fromNum INT, IN toNum INT)
BEGINDECLARE i INT DEFAULT fromNum;DECLARE new_names TEXT DEFAULT '';SET @sql = 'INSERT INTO test_insert_src (name) VALUES ';WHILE i < toNum DOSET new_names = CONCAT(name, i);SET i = i + 1;SET @sql = CONCAT(@sql, '("', new_names, '"),');END WHILE;SET @sql = LEFT(@sql, LENGTH(@sql) - 1);PREPARE stmt FROM @sql;EXECUTE stmt;DEALLOCATE PREPARE stmt;COMMIT;
END //
DELIMITER ;DROP PROCEDURE IF EXISTS test_insert_proc_batch;
DELIMITER //
CREATE PROCEDURE test_insert_proc_batch(IN name TEXT, IN count INT, IN step INT)
BEGINDECLARE i INT DEFAULT 0;WHILE i < count DOCALL test_insert_proc_batch_bulk(name, i, i + step);SET i = i + step;END WHILE;COMMIT;
END //
DELIMITER ;DROP TABLE IF EXISTS test_insert_no_index;
CREATE TABLE test_insert_no_index (id SERIAL PRIMARY KEY,name TEXT
) engine=InnoDB;DROP TABLE IF EXISTS test_insert_normal_index;
CREATE TABLE test_insert_normal_index (id SERIAL PRIMARY KEY,name TEXT,INDEX name_index (name(32))
) engine=InnoDB;DROP TABLE IF EXISTS test_insert_unique_index;
CREATE TABLE test_insert_unique_index (id SERIAL PRIMARY KEY,name TEXT,UNIQUE INDEX name_index (name(32))
) engine=InnoDB;TRUNCATE TABLE test_insert_src;
CALL test_insert_proc_batch('test', 10000000, 5000);TRUNCATE TABLE test_insert_no_index;
INSERT INTO test_insert_no_index (SELECT * FROM test_insert_src LIMIT 1000000);
TRUNCATE TABLE test_insert_no_index;
INSERT INTO test_insert_no_index (SELECT * FROM test_insert_src LIMIT 2000000);
TRUNCATE TABLE test_insert_no_index;
INSERT INTO test_insert_no_index (SELECT * FROM test_insert_src LIMIT 3000000);
TRUNCATE TABLE test_insert_no_index;
INSERT INTO test_insert_no_index (SELECT * FROM test_insert_src LIMIT 4000000);
TRUNCATE TABLE test_insert_no_index;
INSERT INTO test_insert_no_index (SELECT * FROM test_insert_src LIMIT 5000000);
TRUNCATE TABLE test_insert_no_index;
INSERT INTO test_insert_no_index (SELECT * FROM test_insert_src LIMIT 6000000);
TRUNCATE TABLE test_insert_no_index;
INSERT INTO test_insert_no_index (SELECT * FROM test_insert_src LIMIT 7000000);
TRUNCATE TABLE test_insert_no_index;
INSERT INTO test_insert_no_index (SELECT * FROM test_insert_src LIMIT 8000000);
TRUNCATE TABLE test_insert_no_index;
INSERT INTO test_insert_no_index (SELECT * FROM test_insert_src LIMIT 9000000);
TRUNCATE TABLE test_insert_no_index;
INSERT INTO test_insert_no_index (SELECT * FROM test_insert_src);TRUNCATE TABLE test_insert_normal_index;
INSERT INTO test_insert_normal_index (SELECT * FROM test_insert_src LIMIT 1000000);
TRUNCATE TABLE test_insert_normal_index;
INSERT INTO test_insert_normal_index (SELECT * FROM test_insert_src LIMIT 2000000);
TRUNCATE TABLE test_insert_normal_index;
INSERT INTO test_insert_normal_index (SELECT * FROM test_insert_src LIMIT 3000000);
TRUNCATE TABLE test_insert_normal_index;
INSERT INTO test_insert_normal_index (SELECT * FROM test_insert_src LIMIT 4000000);
TRUNCATE TABLE test_insert_normal_index;
INSERT INTO test_insert_normal_index (SELECT * FROM test_insert_src LIMIT 5000000);
TRUNCATE TABLE test_insert_normal_index;
INSERT INTO test_insert_normal_index (SELECT * FROM test_insert_src LIMIT 6000000);
TRUNCATE TABLE test_insert_normal_index;
INSERT INTO test_insert_normal_index (SELECT * FROM test_insert_src LIMIT 7000000);
TRUNCATE TABLE test_insert_normal_index;
INSERT INTO test_insert_normal_index (SELECT * FROM test_insert_src LIMIT 8000000);
TRUNCATE TABLE test_insert_normal_index;
INSERT INTO test_insert_normal_index (SELECT * FROM test_insert_src LIMIT 9000000);
TRUNCATE TABLE test_insert_normal_index;
INSERT INTO test_insert_normal_index (SELECT * FROM test_insert_src);TRUNCATE TABLE test_insert_unique_index;
INSERT INTO test_insert_unique_index (SELECT * FROM test_insert_src LIMIT 1000000);
TRUNCATE TABLE test_insert_unique_index;
INSERT INTO test_insert_unique_index (SELECT * FROM test_insert_src LIMIT 2000000);
TRUNCATE TABLE test_insert_unique_index;
INSERT INTO test_insert_unique_index (SELECT * FROM test_insert_src LIMIT 3000000);
TRUNCATE TABLE test_insert_unique_index;
INSERT INTO test_insert_unique_index (SELECT * FROM test_insert_src LIMIT 4000000);
TRUNCATE TABLE test_insert_unique_index;
INSERT INTO test_insert_unique_index (SELECT * FROM test_insert_src LIMIT 5000000);
TRUNCATE TABLE test_insert_unique_index;
INSERT INTO test_insert_unique_index (SELECT * FROM test_insert_src LIMIT 6000000);
TRUNCATE TABLE test_insert_unique_index;
INSERT INTO test_insert_unique_index (SELECT * FROM test_insert_src LIMIT 7000000);
TRUNCATE TABLE test_insert_unique_index;
INSERT INTO test_insert_unique_index (SELECT * FROM test_insert_src LIMIT 8000000);
TRUNCATE TABLE test_insert_unique_index;
INSERT INTO test_insert_unique_index (SELECT * FROM test_insert_src LIMIT 9000000);
TRUNCATE TABLE test_insert_unique_index;
INSERT INTO test_insert_unique_index (SELECT * FROM test_insert_src);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/25077.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AGP4+ 打包运行闪退,AGP7+ 正常(has code but is marked native or abstract)

问题 安装应用&#xff0c;点击图标启动立马闪退&#xff01; 诡异的闪退&#xff1a;AGP4 打包运行闪退&#xff0c;AGP7 正常 unity 导出的 Android 日志两个主要点&#xff1a; com.android.boot.App 是 Android 的 application 子类&#xff0c;程序入口 java.lang.Class…

数据库-列的完整性约束-概述

引言 我们都知道人以群分 &#xff0c;但分为 若按照 人类的皮肤分类 黄种人&#xff08;其实是西方人定义&#xff09;我们虽然不承认也不否定 &#xff0c;黑皮肤 &#xff0c;棕色人种&#xff08;在南太平洋和西太&#xff09;白种人 排名你懂的 这好像是枚举类型 emm 尴尬…

23种模式之一— — — —适配器模式的详细介绍与讲解

适配器介绍与讲解 一、概念二、适配器模式结构适配器分类核心思想核心角色模式的UML类图应用场景模式优点模式缺点 实例演示图示代码演示运行结果 一、概念 适配器模式&#xff08;别名&#xff1a;包装器&#xff09; 是一种结构型设计模式 将一个类的接口转换成客户希望的另…

Linux ip命令常用操作

ip 命令来自 iproute2 软件包&#xff0c;在 CentOS 7 中默认已安装&#xff08;yum install -y iproute&#xff09;。 iproute2 软件包提供了很多命令&#xff08;rpm -ql iproute |grep bin&#xff09;&#xff0c;如 ss 命令、bridge&#xff0c;这些命令可以完全替代 if…

学生宿舍人走断电系统的开发

学生宿舍人走断电管理系统是一款智能化的电力管理设备&#xff0c;旨在解决学生宿舍用电问题。以下是一些该系统的功能特点: 1.智能控制:系统能够自动识别宿舍内是否有人&#xff0c;当无人时自动断电&#xff0c;避免能源浪费和事故的发生。 2.:系统具有过载保护、短路保护、过…

OCP-042之:Oracle结构体系

1. Oracle结构体系 1.1 概述 1.1.1 版本 版本后缀所代表的含义 i:代表基于Internet架构的数据库,如9i g:代表基于grid(网格)的数据库,如11g grid的目的:降低成本,提高服务质量,简化管理 Storage Grid:ASM(automatic storage management),继承了LVM技术,Oracl…

16_ Vue.js高级指南:条件渲染、列表渲染与数据双向绑定

文章目录 1. 条件渲染v-if2. 列表渲染v-for3. 数据双项绑定v-model4. 计算属性Appendix 1. 条件渲染v-if v-if标签直接接收函数或boolean类型变量 v-if 为true&#xff0c;则当前元素会进入到dom树v-else会自动执行 前方v-if的取反操作 v-show v-show值为true则值展示值不展示…

51单片机-独立按键控制灯灯灯

目录 简介: 一. 1个独立按钮控制一个灯例子 二. 在加一个独立按键,控制第二个灯 三. 第一个开关 开灯, 第二个开关关灯 四. 点一下开灯,在点一下关灯 五. 总结 简介: 51 单片机具有强大的控制能力&#xff0c;而独立按键则提供了一种简单的输入方式。 当把独立按键与 …

LeetCode72编辑距离

题目描述 解析 一般这种给出两个字符串的动态规划问题都是维护一个二维数组&#xff0c;尺寸和这两个字符串的长度相等&#xff0c;用二维做完了后可以尝试优化空间。这一题其实挺类似1143这题的&#xff0c;只不过相比1143的一种方式&#xff0c;变成了三种方式&#xff0c;就…

微型丝杆与滚珠丝杆性能差异与适用场景!

滚珠丝杆是工具机械和精密机械上最常使用的传动元件&#xff0c;其主要功能是将旋转运动转换成线性运动&#xff0c;或将扭矩转换成轴向反复作用力。同时兼具高精度、可逆性和高效率的特点。而微型丝杆是一种直径为0.5mm以下且线性误差在几微米以内&#xff0c;精度高、传动稳定…

vivado HW_BITSTREAM、HW_CFGMEM

HW_比特流 描述 从比特流文件创建的硬件比特流对象hw_bitstream&#xff0c;用于关联 在Vivado的硬件管理器功能中使用硬件设备对象hw_device 设计套件。 比特流文件是从具有write_bitstream的放置和路由设计创建的 命令硬件位流对象是使用 create_hw_bitstream命令&#xff0c…

【Gitlab】Gitlab MAC M1通过Docker Desktop安装教程

一、拉取镜像 docker pull yrzr/gitlab-ce-arm64v8 二、配置容器 2.1 配置Volumes 镜像下载完成后&#xff0c;可在Docker Desktop看到镜像 点击run&#xff0c;弹出以下界面&#xff0c;配置端口映射和目录挂载后&#xff0c;即可生成一个容器 配置Volumes Host PathCont…

机器学习--回归模型和分类模型常用损失函数总结(详细)

文章目录 引言 回归模型常用损失函数均方误差&#xff08;Mean Squared Error, MSE&#xff09;均方根误差&#xff08;Root Mean Squared Error, RMSE&#xff09;平均绝对误差&#xff08;Mean Absolute Error, MAE&#xff09;Huber损失&#xff08;Huber Loss&#xff09; …

【HTTP系列】HTTP1.0/1.1/2.0 的区别

文章目录 一、HTTP1.0二、HTTP1.1三、HTTP2.0# 多路复用二进制分帧首部压缩服务器推送 四、总结HTTP1.0&#xff1a;HTTP1.1&#xff1a;HTTP2.0&#xff1a; 参考文献 一、HTTP1.0 HTTP协议的第二个版本&#xff0c;第一个在通讯中指定版本号的HTTP协议版本 HTTP 1.0 浏览器…

学习笔记——路由网络基础——环回接口(loopback)

6、环回接口(loopback) (1)定义 环回接口(loopback) &#xff1a;是一种虚拟的接口&#xff0c;是一种纯软件性质的虚拟接口&#xff0c;模拟一个单独的网段。 Loopback等于在设备中模拟另外不同的网络&#xff0c;实现不需要物理接口连接设备&#xff0c;依然可以模拟的功能…

海思Hi3519DV500方案1200万无人机吊舱套板

海思Hi3519DV500方案1200万无人机吊舱套板 Hi3519DV500 是一颗面向行业市场推出的超高清智能网络摄像头SoC。该芯片最高 支持四路sensor 输入&#xff0c;支持最高4K30fps 的ISP 图像处理能力&#xff0c;支持2F WDR、 多级降噪、六轴防抖、全景拼接、多光谱融合等多种传统图像…

【Python】一文向您详细介绍 `__dict__` 的作用和用法

【Python】一文向您详细介绍 __dict__ 的作用和用法 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1a;985高校的普通本硕…

以sqlilabs靶场为例,讲解SQL注入攻击原理【42-53关】

【Less-42】 使用 or 11 -- aaa 密码&#xff0c;登陆成功。 找到注入点&#xff1a;密码输入框。 解题步骤&#xff1a; # 获取数据库名 and updatexml(1,concat(0x7e,(select database()),0x7e),1) -- aaa# 获取数据表名 and updatexml(1,concat(0x7e,(select group_conca…

【教程】让小爱音箱Play增强版接入Mi-GPT

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 项目地址&#xff1a;https://github.com/idootop/mi-gpt MiIOT&#xff1a;小米小爱音箱Play 增强版 - 产品规格 - Xiaomi Miot Spec 实现效果图&…

数据库(27)——多表查询——自连接

语法 SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件...; 自连接可以是内连接查询也可以是外连接查询。 演示 我新增了字段friend便于演示 查询所有人的名字以及他们的friend的人的名字&#xff1a; select a.name,b.name from user a,user b where a.friendb.id; 其…