mysql(一) 使用注意事项及优化

news/2024/4/26 2:50:02/文章来源:https://blog.csdn.net/qq_42672839/article/details/129237137

初学mysql的时候、写了一份 "什么是CRUD? CRUD的操作" 的文章(18年的)

我开心看到有朋友经常在下面讨论一些问题、 但是以现在(今天 23年)回头看觉得 那些只是入门需要知道和掌握的、也刚好最近不是很忙 所以我准备整理下 mysql 使用注意事项及优化 

写完也会慢慢完善、后面还会整理一些 索引、执行计划、底层的知识、我们一起学习、一起进步、欢迎指导修正。

基础的mysql写法、语句我就不再赘述了、需要看的上移 "什么是CRUD? CRUD的操作"

目录

1、Mysql大小写问题  (关键字 BINARY )

2、MySQL自身的缓存问题

3、合理使用exist & in

4、索引失效的情景  (常见的情景)

情景1:隐式转换导致索引失效

情景2:查询条件包含or且字段列不含索引

情景3:对索引的列进行数值运算,索引失效

情景5:当查询条件为大于等于、in等范围查询时,根据查询结果占全表数据比例的不同,优化器有可能会放弃索引,进行全表扫描

情景6:特殊的语句 <> ,not in、not exists、is not null  不走索引(辅助索引)

情景7:用or连接的两个含null索引字段,不走索引

情景8:联合索引不满足最左匹配原则

情景9:使用了select * 导致索引失效

情景10:索引列参使用了函数 导致索引失效

情景11:两列数据做比较,即便两列都创建了索引,索引也会失效

情景12:关键字(order by)和函数使用会导致索引失效

5、mysql数据量大的操作

6、索引不要超过6个、且不要在经常更新的字段上建立索引。

7、删除冗余和无效的索引

8、选取最适用的字段属性、尽量把字段设置为NOT NULL

由简到难:

1、Mysql大小写问题  (关键字 BINARY 

MySQL数据库是不区分大小写

创建表  t_test_user_info

CREATE TABLE `t_test_user_info` (`id` int(10) NOT NULL AUTO_INCREMENT,`name` varchar(50) NOT NULL DEFAULT '',`age` varchar(5) NOT NULL DEFAULT '',`create_by` varchar(50) NOT NULL DEFAULT '',`create_time` datetime DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COMMENT='模拟测试表';

插入两条数据(name 字段 都是大小的区别)

INSERT INTO `t_test_user_info`
( `name`, `age`, `create_by`, `create_time`) 
VALUES 
('yzh', '13', 'admin', NOW()),
('Yzh', '15', 'admin', NOW()),
('yzH', '17', 'admin', NOW()), 
('YZH', '19', 'admin', NOW());

写查询语句  select name from t_test_user_info where name="yzh";

结果是所有的数据都查询出来了、那怎么解决呢

写查询语句加关键字 BINARY 

select name from t_test_user_info where BINARY name="yzh";

2、MySQL自身的缓存问题

2.1 MySQL的自身的缓存是严格基于 sql 语句的(MySQL自身缓存是严格区分sql语句的大小写的

select === SELECT 关键字 查询是一样的、但是MySQL自身缓存是严格区分大小写、导致不能缓存命中。

select name from t_test_user_info where id=1;SELECT name FROM t_test_user_info WHERE id=1;

2.2 MySQL的sql语句里面出现不确定信息(例如使用 now() 函数)自身缓存将无法被使用、查询的结构不会被缓存起来

select name, NOW() as newTime from t_test_user_info where id=1;

3、合理使用exist & in

in 是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。如果查询的两个表大小相当,那么用in和exists差别不大。

如果子查询表大的用exists,子查询表小的用in

4、索引失效的情景  (常见的情景)

前提         主键 id
                辅助索引(非聚簇索引) age age_index
                没有索引 name 

ALTER  TABLE  `t_test_user_info` ADD  INDEX age_index (`age`)

情景1:隐式转换导致索引失效

  `age` varchar(5)  
在查询时,where条件是字符串,要带引号 (结果命中索引、扫描2行)

select age from t_test_user_info where age="13";

像上面这条语句又涉及到、索引覆盖和回表 在这里不详细说了、后面写索引的时候再聊。

情景2:查询条件包含or且字段列不含索引

select name,age from t_test_user_info where age="13" or name="yzh";-- 执行计划
EXPLAIN select name,age from t_test_user_info where age="13" or name="yzh";

执行计划结果

 age or name == 辅助索引+or+无索引、会走索引列,但无索引的列会进行全表扫描

-- 执行计划
EXPLAIN select name,age from t_test_user_info where  id="2" or age="13";-- 执行计划
EXPLAIN select name,age from t_test_user_info where  age="13" or id="2";

辅助索引 +or+ 主键索引

主键索引 +or+ 辅助索引

结果显示可能命中索引,实际没有命中的 key==null (索引)  type是ALL全表扫描

情景3:对索引的列进行数值运算,索引失效

select name,age from t_test_user_info where age * 1  = 13;-- 执行计划
EXPLAIN select name,age from t_test_user_info where age * 1  = 13;

情景4:like%为前缀的非覆盖索引

%在前面,不走索引、type 是ALL 全表扫描

select name,age from t_test_user_info where age like "%3";-- 执行计划
EXPLAIN select name,age from t_test_user_info where age like "%3";

 %不在在前面,走索引、type 是  rang 根据索引范围扫描,返回匹配值域的行  rows 扫描1行

select name,age from t_test_user_info where age like "23%";-- 执行计划
EXPLAIN select name,age from t_test_user_info where age like "23%";

 情景5:当查询条件为大于等于、in等范围查询时,根据查询结果占全表数据比例的不同,优化器有可能会放弃索引,进行全表扫描

还有在实际的特殊情况 :比如查询的结果集数据超出大部分会导致全部表扫描(优化器认为没有必要走索引)

比如超出25%大部分都1开头的年龄  使用 "1%"    (实际遇到这个也可以用limit 来分解结果集 ) 

-- 执行计划
EXPLAIN select name,age from t_test_user_info where age like "1%";

用limit 来分解结果集 支持走索引

-- 执行计划
EXPLAIN select name,age from t_test_user_info where age like "1%" limit 2;

情景6:特殊的语句 <> ,not in、not exists、is not null  不走索引(辅助索引)

情景7:or连接的两个含null索引字段,不走索引

情景8:联合索引不满足最左匹配原则

情景9:使用了select * 导致索引失效

情景10:索引列参使用了函数 导致索引失效

情景11:两列数据做比较,即便两列都创建了索引,索引也会失效

情景12:关键字(order by)和函数使用会导致索引失效

5、mysql数据量大的操作

若插入数据过多,考虑批量插入、避免同时修改或删除过多数据分批操作

6、索引不要超过6个、且不要在经常更新的字段上建立索引。

索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。

7、删除冗余和无效的索引

如果表中存在索引:

KEY `name_age` (`name`, `age`);
KEY `age` (`age`);

上面第二个索引属于冗余索引,需要删除掉。

8、选取最适用的字段属性、尽量把字段设置为NOT NULL

MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快。因此,在创建表的时候,我们可以将表中字段的宽度设得尽可能小,同时应该尽量把字段设置为NOT NULL,这样在将来执行查询的时候,数据库不用去比较NULL值。

版权声明:转载请附上文章地址DJyzh的博客_CSDN博客-java基础,框架,java高级领域博主

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

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

相关文章

区块链行业遭供应链攻击,上万加密钱包被“抄底”损失上亿美元

当地时间8月2日晚间&#xff0c; 区块链行业遭遇了一次行业重创 。据科技媒体TechCrunch报道&#xff0c; 若干名攻击者“抄底”了上万个加密钱包&#xff0c;钱包内有价值上亿美元的代币。 据了解遭受攻击的加密钱包包括Phantom、Slope和TrustWallet等。涉及到的币种除了SOL、…

网上招聘系统

技术&#xff1a;Java、JSP等摘要&#xff1a;当今&#xff0c;人类社会已经进入信息全球化和全球信息化、网络化的高速发展阶段。丰富的网络信息已经成为人们工作、生活、学习中不可缺少的一部分。人们正在逐步适应和习惯于网上贸易、网上购物、网上支付、网上服务和网上娱乐等…

为什么文档对 SaaS 公司至关重要?

在过去十年左右的时间里&#xff0c;SaaS的兴起使全球数百家公司成为家喻户晓的公司。但他们并不是仅仅依靠产品的力量到达那里的。客户服务和支持是使一切在幕后顺利进行的原因——其中很大一部分是文档。以正确的风格和正确的位置在您的网站上找到适当的用户文档对于将浏览器…

RNN相关知识总结

目录RNN结构与原理1.模型总览2.反向传播LSTM结构与原理1.模型总览2.如何解决RNN梯度消失/爆炸问题&#xff1f;GRU结构及原理1.模型总览LSTM与GRU的区别RNN结构与原理 1.模型总览 上图是RNN的展开结构图&#xff0c;由输入层、隐藏层和输出层组成。当前时间步t 的隐藏状态hth_…

【神经网络】Transformer基础问答

1.Transforme与LSTM的区别 transformer和LSTM最大的区别就是LSTM的训练是迭代的&#xff0c;无法并行训练&#xff0c;LSTM单元计算完T时刻信息后&#xff0c;才会处理T1时刻的信息&#xff0c;T 1时刻的计算依赖 T-时刻的隐层计算结果。而transformer的训练是并行了&#xff0…

快速找到外贸客户的9种方法(建议收藏)

所有外贸企业想要做好外贸出口的头等大事&#xff0c;就是要快速的找到优质的外贸客户和订单&#xff0c;没有订单的达成&#xff0c;所有的努力都是图劳&#xff0c;还有可能会陷入一种虚假的繁荣&#xff0c;每天都很忙&#xff0c;但是没有结果。今天&#xff0c;小编就来分…

第一章 1:函数

函数概念 函数我们可以简单的理解为一个自变量只对应一个函数值&#xff0c;如图&#xff1a; 如图所示的图像&#xff0c;我们可以把其理解为函数&#xff0c;那非函数呢&#xff1f; 这个就叫做非函数&#xff0c;因为我们的一个自变量对应了两个函数值。 函数的两要素&…

极智项目 | 实战pytorch arcface人脸识别

欢迎关注我的公众号 [极智视界]&#xff0c;获取我的更多经验分享 大家好&#xff0c;我是极智视界&#xff0c;本文介绍 实战pytorch arcface人脸识别&#xff0c;并提供完整项目源码。 本文介绍的实战arcface人脸识别项目&#xff0c;提供完整的可以一键训练、测试的项目工程…

不怕被AirTag跟踪?苹果Find My技术越来越普及

苹果的 AirTag 自推出以来&#xff0c;如何有效遏制用户用其进行非法跟踪&#xff0c;是摆在苹果面前的一大难题。一家为执法部门制造无线扫描设备的公司近日通过 KickStarter 平台&#xff0c;众筹了一款消费级产品&#xff0c;可帮助用户检测周围是否存在追踪的 AirTag 等设备…

【2023全网最全教程】从0到1开发自动化测试框架(建议收藏)

一、序言 随着项目版本的快速迭代、APP测试有以下几个特点&#xff1a; 首先&#xff0c;功能点多且细&#xff0c;测试工作量大&#xff0c;容易遗漏&#xff1b;其次&#xff0c;代码模块常改动&#xff0c;回归测试很频繁&#xff0c;测试重复低效&#xff1b;最后&#x…

小米无线AR眼镜探索版细节汇总

在MWC 2023期间&#xff0c;小米正式发布了一款无线AR眼镜&#xff0c;虽然还没看过实机&#xff0c;但XDA提前上手体验&#xff0c;我们从中进行总结。首先我要说的是&#xff0c;小米这款眼镜和高通无线AR眼镜参考设计高度重叠&#xff0c;产品卖点几乎一致&#xff0c;只是增…

微服务框架-学习笔记

1 微服务架构介绍 1.1 系统架构演变历史 单体架构垂直应用架构&#xff1a;按照业务线垂直划分分布式架构&#xff1a;抽出业务无关的公共模块SOA架构&#xff1a;面向服务微服务架构&#xff1a;彻底的服务化1.2 微服务架构概览 1.3 微服务架构核心要素 服务治理&#xff1…

观测云产品更新|新增用户访问监测自动化追踪;新增 CDN 质量分析;新增自定义查看器导航菜单等

观测云更新 用户访问监测优化 新增用户访问监测自动化追踪 用户访问监测新增自动化追踪&#xff0c;通过“浏览器插件”的实现方式&#xff0c;使用浏览器记录用户访问行为&#xff0c;创建无代码的端到端测试。更多详情可参考文档【 自动化追踪 】https://docs.guance.com/…

SpringBoot整合XxlJob

SpringBoot整合XxlJob 1.XxlJob简介 官方网址&#xff1a;https://www.xuxueli.com/xxl-job XXL-JOB是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线&#xff0c;开箱即用。 为什么要使…

Macbook M1 安装PDI(Kettle) 9.3

Macbook M1 安装PDI(Kettle) 9.3 当前 PDI&#xff08;Kettle&#xff09;最新版为9.3&#xff0c;依赖Java JDK 11。因为没有专门用于 M1的程序&#xff0c;需要下载并安装x86_64架构的JDK及依赖软件&#xff0c;并 “强制在Intel模式下运行shell” 的方式来实现 Kettle 的正…

【YOLO系列】YOLOv4论文超详细解读1(翻译 +学习笔记)

前言 经过上一期的开篇介绍&#xff0c;我们知道YOLO之父Redmon在twitter正式宣布退出cv界&#xff0c;大家都以为YOLO系列就此终结的时候&#xff0c;天空一声巨响&#xff0c;YOLOv4闪亮登场&#xff01;v4作者是AlexeyAB大神&#xff0c;虽然换人了&#xff0c;但论文中给出…

【Project】项目管理软件学习笔记

一、前言使用Project制定项目计划步骤大致如下&#xff1a;以Project2013为例&#xff0c;按照上图步骤指定项目计划。二、实施2.1 创建空白项目点击文件——新建——空白项目&#xff0c;即完成了空白项目的创建&#xff0c;在此我把该项目保存为60mm项目管理.mpp&#xff0c;…

内存保护_2:RTA-OS内存保护逻辑及配置说明

上一篇 | 返回主目录 | 下一篇 内存保护_2&#xff1a;RTA-OS内存保护逻辑及配置说明3 OS配置说明3.1 OS一些基本概念及相互关系3.1.1 基本概念3.1.2 相互关系3.2 内存保护基本逻辑&#xff08;RTA-OS&#xff09;3.2.1 应用集的基本分类3.2.2 内存保护与应用集的关系3.3 OS等级…

【python】条件语句,简单理解

嗨害大家好鸭&#xff01;我是小熊猫~ Python 条件语句 Python条件语句是通过一条或多条语句的执行结果&#xff08;True或者False&#xff09;来决定执行的代码块。 可以通过下图来简单了解条件语句的执行过程: 更多python资料获取:点击此处跳转文末名片获取 Python程序语言…

“华为杯”研究生数学建模竞赛2006年-【华为杯】A题:Ad Hoc 网络中的区域划分和资源分配问题(附获奖论文)

赛题描述 Ad Hoc网络是当前网络和通信技术研究的热点之一,对于诸如军队和在野外作业的大型公司和集团来说,Ad Hoc网络有着无需基站、无需特定交换和路由节点、随机组建、灵活接入、移动方便等特点,因而具有极大的吸引力。 在Ad Hoc网络中,节点之间的通信均通过无线传输来完…