MySQL数据库索引优化实战

news2024/11/28 10:50:43

目录

一、前言

二、准备工作

2.1 用户表(TB_USER)

2.2 商品表(TB_SKU)

2.3 订单表(TB_ORDER)

三、实例分析

3.1 索引提升查询性能

3.2 多表查询

3.3 索引失效

四、总结


一、前言

在数据库的应用中,性能优化是一个持续不断的过程。其中索引优化是提高查询速度的最有效的方法,本文将通过案例,深入探讨MySQL索引优化,帮助读者理解索引优化、在实际的应用中提升性能。

二、准备工作

在开始优化分析之前,现在准备好三张表TB_USER、TB_SKU、TB_ORDER表。

2.1 用户表(TB_USER)

用户表结构如下

创建表的语句:

CREATE TABLE `tb_user`  (
  `id` int(0) NOT NULL COMMENT 'id',
  `create_time` datetime(0) NOT NULL COMMENT '创建时间',
  `creator` varchar(20) NOT NULL COMMENT '创建人',
  `user_id` int(0) NOT NULL COMMENT '用户id',
  `user_name` varchar(30) NOT NULL COMMENT '用户名',
  `addr` varchar(300) NULL DEFAULT NULL COMMENT '地址',
  `remark` varchar(200)  NULL DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`) USING BTREE
) ;

2.2 商品表(TB_SKU)

表结构如下

创建表的语句

CREATE TABLE `tb_sku`  (
  `id` int(0) NOT NULL COMMENT 'id',
  `create_time` datetime(0) NOT NULL COMMENT '创建时间',
  `creator` varchar(20) NOT NULL COMMENT '创建人',
  `sku_id` int(0) NOT NULL COMMENT '商品id',
  `sku_name` varchar(200) NOT NULL COMMENT '商品名称',
  `remark` varchar(200)  NULL DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`) USING BTREE
);

2.3 订单表(TB_ORDER)

表结构如下:

创建表的语句:

CREATE TABLE `tb_order`  (
  `id` int(0) NOT NULL,
  `create_time` datetime(0) NOT NULL,
  `creator` varchar(20)  NOT NULL,
  `user_id` int(0) NOT NULL,
  `sku_id` int(0) NOT NULL,
  `status` varchar(1)  NULL DEFAULT NULL,
  `remark` varchar(200)  NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ;

三、实例分析

在上一篇文章中介绍了索引的优化策略,最后介绍了查看SQL执行技术的关键字explain,并对explain执行计划的各个字段作了介绍,本文将结合实例对各个字段作详细介绍。

3.1 索引提升查询性能

tb_user表总共有6条数据,一个id主键索引,因此用select * from tb_user where user_id=1;去查询的时候,

1. select_type=SIMPLE,简单查询,因为这是一个单表的查询;

2. type=ALL, type的类型有:NULL、system、const、eq_ref、ref、range、index、all;从左到右,性能逐一降低,all的性能最差,属于全部扫描。

3.filtered=16.67,也就是从全部6条记录中筛选出1条,filtered的值是越大越好。

接下来,给tb_user增加一个user_id的索引,然后再来看执行计划

create index idx_tb_user_user_id on tb_user(user_id);

 

从上图的执行计划可以看到,type变成了ref,也就是查询的时候使用了索引; filtered的值变成了100.00,因此性能得到了很大的提升。

下一步,将idex_tb_user_user_id的索引删除,重新创建唯一索引,再来看执行计划

alter table tb_user drop index idx_tb_user_user_id;
create unique index idx_tb_user_user_id on tb_user(user_id);

 type再次从ref变为了const,性能再次得到了提升。

3.2 多表查询

从tb_user、tb_sku、tb_order三张表中查询用户都买了哪些商品

 查看这个SQL的执行计划

对于id是相同的,从上往下执行。

如果id不同的情况,id越大越先执行,假设通过子查询的方式,查询买了铅笔的人名。

查看以下这个SQL的执行计划

这个的执行顺序,跟我们理解的也是一样,应该先去查询tb_sku,查出sku_id,再根据sku_id查询tb_order表,查询user_id,最后再去查询tb_user表;

3.3 索引失效

1. 不要在索引列上运算,否则索引会失效。在user_id上作了运算之后,索引失效,性能降低。

2. 字符串字段,查询时如果没有加单引号,索引失效

首先,我们在tb_order表的status字段上加上索引, 

create index idx_tb_order_status on tb_order(status);

3.  or连接时,一侧有索引、一侧没有索引,索引失效

4. 数据分布影响,这个可能是我们平时在做索引优化时,会被忽略的一点,之前在实际项目中碰到过类似的情况,后来重要明白是因为数据分布导致的。 

我们先将tb_order表中的status字段全更新为9,然后再来查看执行计划。因为当MySQL评估使用索引比全表更慢,则不使用索引。

另外我们将tb_order的数据分布设置为如下:

再进行status>='2' 和 status>='0'的查询,会发现status>='2'的时候,会使用索引,而status>='0'的时候,不会使用索引,而执行全表查询。这是因为数据分布影响的。

四、总结

本文根据实际例子介绍了如何提升查询性能、索引失效等问题,索引对于提升查询性能有很大的帮助,但是也不能滥用索引,因为使用索引本身会占用存储空间,影响数据插入和更新的速度。

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

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

相关文章

【操作系统】输入输出系统

6.1 I/O系统的功能、模型和接口 I/O系统管理的主要对象是I/O设备和相应的设备控制器。其最主要的任务是,完成用户提出的I/O请求,提高I/O速率,以及提高设备的利用率,并能为更高层的进程方便地使用这些设备提供手段。 6.1.1 I/O系…

本地git服务器的使用

最后总结一句,用gitlab最省事,管理权限最方便,别像下文一样整了。 Windows上使用: 首先要在windows开发机上生成密钥: 1.安装git,首先去git官网下载git,https://git-scm.com/downloads&#xff…

2023年工作初体验

23年终于正式入职,参与了正式上线的电商平台、crm平台等项目的研发,公司规模较小,气氛融洽,没有任何勾心斗角、末位淘汰,几乎没什么压力。虽然是我的第一家公司,但实际是个适合养老的公司(笑 总…

Web自动化测试:POM设计模式的实现

关于pom设计模式(project Object model/PageObject),一种底层、逻辑、用例的分层,在项目还没有开发出来时,就可以开始写UI自动化脚本了,在开发完成后,再进行元素定位的适配以及调试;而且也可以多人共同维护…

清风数学建模笔记-主成分分析

内容:主成分分析 介绍: 主成分分析是一种降维算法,它通过旋转和变换将多个指标转化为少数几个主成分,这些主成分是原变量的线性组合,且互不相关,其能反映出原始数据的大部分信息。 例如解决多重共线性问题…

CSS 放大旋转动画

<template><div class"container" mouseenter"startAnimation" mouseleave"stopAnimation"><!-- 旋方块 --><div class"box" :class"{ rotate-scale-up: isAnimating }"><!-- 元素内容 -->&l…

不要盲目自学网络安全!学习顺序特别重要!

前言 一、什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防…

计算机视觉入门与调优

大家好啊&#xff0c;我是董董灿。 在 CSDN 上写文章写了有一段时间了&#xff0c;期间不少小伙伴私信我&#xff0c;咨询如何自学入门AI&#xff0c;或者咨询一些AI算法。 90%的问题我都回复了&#xff0c;但有时确实因为太忙&#xff0c;没顾得过来。 在这个过程中&#x…

金和OA jc6 ntko-upload 任意文件上传漏洞

产品简介 金和网络是专业信息化服务商&#xff0c;为城市监管部门提供了互联网监管解决方案&#xff0c;为企事业单位提供组织协同OA系统升开发平台&#xff0c;电子政务一体化平台智慧电商平合等服务 漏洞概述 金和OA jc6系统ntkoUpload接口处存在任意文件上传漏洞&#xf…

day06、SQL语言之概述

SQl 语言之概述 6.1 SQL语言概述6.2 SQL语言之DDL定义数据库6.3 SQL语言之DML操纵数据库 6.1 SQL语言概述 6.2 SQL语言之DDL定义数据库 6.3 SQL语言之DML操纵数据库

python学完之后可以做什么,python学完可以做什么

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python学完可以做哪些工作&#xff0c;python学完之后可以做什么&#xff0c;今天让我们一起来看看吧&#xff01; Python是一种全栈的开发语言&#xff0c;你如果能学好Python&#xff0c;前端&#xff0c;后端&#x…

第十四章 14.2案例:使用KVM命令集管理虚拟机

查看命令帮助 [rootLinux01 ~]# virsh -h—————————————————————————————————————————— 查看KVM的配置文件存放目录〈test01 , xml是虚拟机系统实例的配置文件) [rootLinux01 ~]# ls /etc/libvirt/qemu —————————————…

[一文详解]Base64编码,Url Base64编码,UrlEncode编码,你还傻傻分不清吗?

base64编码 由来 Base64算法最早应用于解决电子邮件传输问题&#xff0c;在早期&#xff0c;电子邮件只支持ASCII码字符。 而ASCII码其长度为1个字节&#xff0c;是7位编码&#xff0c;最高位是0,是有符号字符型数。 如果要传输一封带有非ASCII码字符的电子邮件&#xff0c…

干洗机,将对相关行业带来巨大的发展机遇

干洗机是一种高效、节能、环保的清洗设备&#xff0c;广泛应用于干洗店、酒店、医疗机构、工厂等领域。全球市场 全球市场上&#xff0c;干洗机的市场规模和应用范围不断扩大。根据市场研究机构的数据&#xff0c;2019年全球干洗机市场规模约为80亿美元左右&#xff0c;年复合增…

2023年终总结,被裁员

在一个睡意朦胧的早上&#xff0c;我被闹钟惊醒&#xff0c;原来今天已经是2024年1月1日了&#xff0c;2023年平平无奇的结束了&#xff0c;唯一让我感触波深的事情是我在二月份的裁员名单里面。2024加油&#xff01;&#xff01;&#xff01; 工作上的总结 回顾2023&#xf…

LLM Agent之再谈RAG的召回信息密度和质量

话接上文的召回多样性优化&#xff0c;多路索引的召回方案可以提供更多的潜在候选内容。但候选越多&#xff0c;如何对这些内容进行筛选和排序就变得更加重要。这一章我们唠唠召回的信息密度和质量。同样参考经典搜索和推荐框架&#xff0c;这一章对应排序重排环节&#xff0c;…

听GPT 讲Rust源代码--compiler(8)

File: rust/compiler/rustc_trait_selection/src/solve/weak_types.rs 在Rust编译器的源代码中&#xff0c;rust/compiler/rustc_trait_selection/src/solve/weak_types.rs文件的作用是处理弱类型化解决方案。 在编译器中&#xff0c;当我们在代码中使用一个未经完全指定的泛型…

javascript 常见工具函数(二)

11.数组等分切片&#xff1a; this.newMapList []; for (var i 0; i < this.mapDataList.length; i 2) {this.newMapList.push(this.mapDataList.slice(i, i 2)); } 12.js做奇偶判断&#xff1a; if (this.mapDataList.length ! 0) {this.mapDataList.length % 2 0 ?…

python包chromadb安装失败总结

1&#xff0c;背景&#xff1a; 最近在学习langchain的课程&#xff0c;里面创建自己的知识库的Retrieval模块中&#xff0c;需要用到向量数据库。 所以按照官方的教程&#xff08;vectorstores&#xff09;&#xff0c;准备使用chroma的向量数据库。图片来源 2&#xff0c;问…

14.两数之和

题目 class Solution {public int[] twoSum(int[] nums, int target) {int[] ret {-1,-1};for(int i0;i<nums.length;i) {for(int ji1;j<nums.length;j) {if(nums[i] nums[j] target) {ret[0] i;ret[1] j;}}}return ret;} }