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

news2024/11/26 21:46:18

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

结论

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

实验数据

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

测试环境

见《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)
BEGIN
    DECLARE i INT DEFAULT fromNum;
    DECLARE new_names TEXT DEFAULT '';
    SET @sql = 'INSERT INTO test_insert_src (name) VALUES ';
    WHILE i < toNum DO
        SET 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)
BEGIN
    DECLARE i INT DEFAULT 0;
    WHILE i < count DO
        CALL 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.coloradmin.cn/o/1805457.html

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

相关文章

UniAnimate:华科提出人类跳舞视频生成新框架,支持合成一分钟高清视频

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学。 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 合集&#x…

堆排序讲解

前言 在讲堆的删除时&#xff0c;我们发现一步一步删除堆顶的数据&#xff0c;排列起来呈现出排序的规律&#xff0c;所以本节小编将带领大家进一步理解堆排序。 1.堆排序概念 那么什么是堆排序&#xff1f; 堆排序&#xff08;Heap Sort&#xff09;是一种基于堆数据结构的排…

如何从 Android 图库中恢复误删除的照片

如果您正在阅读这篇文章&#xff0c;那么您肯定意外地从 Android 设备中删除了照片。并且您正在寻找一种简单的方法来恢复 Android 图库中已删除的照片。 从图库恢复已删除的照片 随着技术的进步&#xff0c;现在使用单个设备&#xff08;即 Android 手机&#xff09;&#xf…

vue27:脚手架详细介绍main.js

在 Vue.js 中&#xff0c;render 函数是一个可选的选项&#xff0c;它允许你自定义组件的渲染逻辑。 如果你没有在 Vue 实例中提供 render 函数&#xff0c;Vue 将使用模板&#xff08;template&#xff09;来生成虚拟 DOM。 以下是render / template 两种方式的比较&#…

C++ Qt实现http url启动本地应用程序

更多Qt文章,请访问《深入浅出C++ Qt开发技术专栏》:https://blog.csdn.net/yao_hou/category_9276099.html 文章目录 1、注册自定义协议2、编写web页面3、编写C++应用程序我们在使用腾讯会议时经常会通过http链接打开本地的腾讯会议,例如下图: 打开会议发起人给的链接,会出…

Python代码大使用Paramiko轻松判断文件类型,提取上级目录

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 一、Paramiko简介 Paramiko是一个用于SSHv2协议的Python实现&#xff0c;提供了客户端和服务器功能。它可以用于远程连接和管理服务器&#xff0c;执行命令、上传下载文件等。本文将介绍如何使用Paramiko判断文件类…

树莓派4B 零起点(二) 树莓派 更换软件源和软件仓库

目录 一、准备工作&#xff0c;查看自己的树莓派版本 二、安装HTTPS支持 三、更换为清华源 1、更换Debian软件源 2&#xff0c;更换Raspberrypi软件仓库 四、进行软件更新 接前章&#xff0c;我们的树莓派已经启动起来了&#xff0c;接下来要干的事那就是更换软件源和软件…

LeetCode ---400周赛

题目列表 3168. 候诊室中的最少椅子数 3169. 无需开会的工作日 3170. 删除星号以后字典序最小的字符串 3171. 找到按位与最接近 K 的子数组 一、候诊室中的最少椅子数 简单的模拟题&#xff0c;我们可以这样来模拟&#xff1a;当有顾客来时&#xff0c;我们加一把椅子&…

java并发控制(猴子摘桃例子)

【问题】 有n个桃子&#xff0c; 猴子A每次固定摘2个&#xff0c;猴子B每次固定摘3个&#xff0c;这2只猴子不断摘桃子直到剩余桃子数量不足以摘&#xff08;必须满足摘桃个数&#xff09;&#xff1b; 【1】 使用AtomicInteger&#xff08;推荐&#xff09; 1&#xff09;利…

11 深入理解Linux文件系统与日志分析

目录 11.1 深入理解Linux文件系统 11.1.1 inode与block详解 1. inode和block概述 2. inode的内容 3. inode的号码 4. inode的大小 11.1.2 硬链接与软连接 1. 硬链接 2. 软连接 11.1.3 EXT类型文件恢复 1. 编译安装extundelete 2. 模拟删除并执行恢复操作 11.1.4 xfs类型文件备…

【Centos】深度解析:CentOS下安装pip的完整指南

【Centos】深度解析&#xff1a;CentOS下安装pip的完整指南 大家好 我是寸铁&#x1f44a; 总结了一篇【Centos】深度解析&#xff1a;CentOS下安装pip的完整指南✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 方式1(推荐) 下载get-pip.py到本地 sudo wget https://bootstrap.p…

用python编撰一个电脑清理程序

自制一个电脑清理程序&#xff0c;有啥用呢&#xff1f;在电脑不装有清理软件的时候&#xff0c;可以解决自己电脑内存不足的情况。 1、设想需要删除指定文件夹中的临时文件和缓存文件。以下是代码。 import os import shutil def clean_folder(folder_path): for root,…

CleanMyMac X 4.15.4破解版含2024最新CleanMyMac激活码

CleanMyMac X 4.15.4 for Mac 2023最新中文激活版是一款mac电脑清理工具&#xff0c;可让您快速轻松地个性化您的 Mac 操作系统。此外&#xff0c;它提高了系统速度和性能&#xff0c;帮助你远离黑客和垃圾文件。该程序具有尖端工具和功能&#xff0c;能够清除Mac系统中的任何故…

利用SuperGlue算法实现跨尺度金字塔特征点的高效匹配(含py代码)

在计算机视觉领域&#xff0c;特征点匹配是一个基础而关键的任务&#xff0c;广泛应用于图像拼接、三维重建、目标跟踪等方向。传统的特征点匹配方法通常基于相同尺度下提取的特征进行匹配&#xff0c;然而在实际场景中&#xff0c;由于成像距离、分辨率等因素的差异&#xff0…

图像处理ASIC设计方法 笔记29 场景自适应校正算法

P152 7.2.3 场景自适应校正算法 (一)Scribner提出的神经网络非均匀性校正算法 非均匀性校正(Non-Uniformity Correction,简称NUC)算法是红外成像技术中非常重要的一个环节。它主要用于校正红外焦平面阵列(Infrared Focal Plane Arrays,简称IRFPA)中的固定模式噪声,以提…

《python程序语言设计》2018版第5章第46题均值和标准方差-下部(本来想和大家说抱歉,但成功了)

接上回&#xff0c;5.46题如何的标准方差 本来想和大家说非常抱歉各位同学们。我没有找到通过一个循环完成两个结果的代码。 但我逐步往下的写&#xff0c;我终于成功了&#xff01;&#xff01; 这是我大前天在单位找到的公式里。x上面带一横是平均值。 我不能用函数的办法…

高考后志愿填报信息采集系统制作指南

在高考的硝烟散去之后&#xff0c;每位学生都面临着一个重要的任务——志愿填报。老师们如何高效、准确地收集和整理这些信息&#xff0c;成为了一个棘手的问题。难道我们只能依赖传统的手工登记方式&#xff0c;忍受其繁琐和易错吗&#xff1f; 易查分是一个简单易用的在线工具…

基于GTX 8B10B编码的自定义PHY上板测试(高速收发器十四)

前文整理了GTX IP&#xff0c;完成了自定义PHY协议的收发模块设计&#xff0c;本文将通过光纤回环&#xff0c;对这些模块上板测试&#xff0c;首先需要编写一个用于生成测试数据的用户模块。 1、测试数据生成模块 本模块用于生成自定义PHY协议的测试数据&#xff0c;通过axi_…

XUbuntu24.04之ch9344(usb转串口芯片)安装驱动(二百四十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

DVB-S系统发射端Matlab仿真及FPGA实现

DVB标准 Digital Video Broadcasting&#xff08;数字视频广播&#xff09;是一个完整的数字电视解决方案&#xff0c;其中包括DVB-C&#xff08;数字电视有线传输标准&#xff09;&#xff0c; DVB-T&#xff08;数字电视地面传输标准&#xff09;&#xff0c;DVB-S&#xff…