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

news2024/11/15 19:58:49

初学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.coloradmin.cn/o/376448.html

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

相关文章

S3C2440开发环境搭建

拿出了之前的S3C2440开发板&#xff0c;然后把移植uboot、移植内核、制作根文件系统、设备树编写驱动等几项再做一遍&#xff0c;这篇文章先记录下环境搭建过程&#xff0c;以及先把现成的uboot、内核、根文件系统下载进去&#xff0c;看看开发板还能不能用&#xff0c;先熟悉一…

【C++】踏入C++的大门(万字总结)

文章目录&#x1f3aa; 踏入C的大门&#x1f680;1.什么是C&#x1f680;2.C发展史&#x1f680;3.C关键字&#x1f680;4.命名空间⭐4.1 命名空间定义⭐4.2 命名空间使用⭐4.3 C输入和输出&#x1f680;5.缺省参数⭐5.1 缺省参数概念⭐5.2 缺省参数分类&#x1f680;6.函数重载…

Unreal Engine10:Character的实现

写在前面 这里主要是介绍一下Character的实现&#xff0c;顺带也介绍一下UE4资源的获取&#xff1b; 一、UE4资源获取 1. 地图的获取 1.1 下载资源 在Epic Games Launcher的虚幻商城中搜索内容&#xff0c;带有环境标签的就主要是地图资源&#xff1b;有一些是免费的资源和…

C#--耗时操作实现UI界面实时更新不阻塞(耗时操作解决窗体卡顿)

前言C#实现窗体加载进度条或者百分比实时显示耗时操作的进度&#xff0c;方法有很多。但是经过我的学习、查找与实际应用&#xff0c;发现Task配合MethodInvoker最为高效便捷。下面我就来结合代码讲一下要注意的问题。基础知识C#在winform上进行耗时操作往往会放置progressbar&…

JavaWeb 实战 01 - 计算机是如何工作的

计算机是如何工作的1. 计算机发展史2. 计算机的基本组成2.1 冯诺依曼体系结构2.2 CPU的内部结构2.3 指令2.3.1 指令表2.3.1.1 寄存器2.3.2 CPU的工作流程2.4 小结3. 操作系统3.1 核心功能3.2 操作系统的软硬件结构3.3 什么是进程 / 任务3.4 进程管理3.4.1 管理3.4.2 PCB : 进程…

Carl2——二叉树

一.定义struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNode(int x) : val(x), left(NULL), right(NULL) {} };二.遍历深度优先1.1 迭代法【1】前序遍历&#xff08;144&#xff09;class Solution { public:vector<int> preorderTraversal(TreeNode* roo…

小文智能结合ChatGPT的产业未来

最近几个月&#xff0c;由人工智能实验室OpenAI发布的对话式大型语言模型ChatGPT在国内外各大平台掀起了一阵AI狂潮。短短几天时间&#xff0c;其用户量就突破了百万大关&#xff0c;注册用户之多一度导致服务器爆满。 继AI画图之后&#xff0c;ChatGPT成为了新的顶流&#xf…

支付宝二面:使用 try-catch 捕获异常会影响性能吗?

一. JVM异常处理逻辑 Java 程序中显式抛出异常由athrow指令支持&#xff0c;除了通过 throw 主动抛出异常外&#xff0c;JVM规范中还规定了许多运行时异常会在检测到异常状况时自动抛出(效果等同athrow), 例如除数为0时就会自动抛出异常&#xff0c;以及大名鼎鼎的 NullPointe…

论文阅读:NeRF++: ANALYZING AND IMPROVING NEURAL RADIANCE FIELDS

中文标题&#xff1a;分析并提升神经辐射场 提出问题 把NeRF生成的视角图像投影到一个球模型上&#xff08;体密度在球面上为1&#xff0c;其余为零&#xff09;&#xff0c;这个模型可以很好解释训练集&#xff08;左2&#xff09;&#xff0c;但是一旦推广到其他视角&#x…

阶段八:服务框架高级(第五章:服务异步通信-高级篇(RabbitMQ高级))

阶段八&#xff1a;服务框架高级&#xff08;第五章&#xff1a;服务异步通信-高级篇&#xff08;RabbitMQ高级&#xff09;&#xff09;Day-第五章&#xff1a;服务异步通信-高级篇&#xff08;RabbitMQ高级&#xff09;0.学习目标1.消息可靠性1.1.生产者消息确认1.1.1.修改配…

Docker离线部署

Docker离线部署 目录 1、需求说明 2、下载docker安装包 3、上传docker安装包 4、解压docker安装包 5、解压的docker文件夹全部移动至/usr/bin目录 6、将docker注册为系统服务 7、重启生效 8、设置开机自启 9、查看docker版本信息 1、需求说明 大部份公司为了服务安全…

【PostgreSQL的idle in transaction连接状态】

在平时查询pg_stat_activity这个视图的时候&#xff0c;每一行包含了一个进程的相关信息&#xff0c;包含当前正在执行的SQL&#xff0c;或者会话的状态等等&#xff0c;state字段表示当前进程的状态。在PostgreSQL数据库里&#xff0c;其实代码里总共定义了7种BackendState&am…

手推式洗地机什么牌子好?洗地机品牌排行榜

当今潮流下&#xff0c;大家都开始纷纷追求高品质的居家生活&#xff0c;洗地机也成为越来越多人的追求&#xff0c;因为和传统的吸尘器相比&#xff0c;洗地机除了有扫地的功能之外&#xff0c;还可以轻松搞定家里的拖地任务&#xff0c;下面我们一起来看看洗地机排行榜都有哪…

怎么把音乐传到苹果手机上?如何将铃声导入iphone

很多人肯定都有这样的经验—比起电脑&#xff0c;使用iPhone和iPad播放音乐能获得更好的声音体验。 因此&#xff0c;现在有越来越多的用户将音乐传输到iPhone/iPad上播放。怎么把音乐传到苹果手机上&#xff1f;把音乐导入苹果手机&#xff0c;主要有2种方法&#xff1a;一种是…

【python】运算符,有关它的一切,都在这里了

Python运算符嗨害大家好鸭&#xff01;我是小熊猫~什么是运算符&#xff1f;Python算术运算符Python比较运算符Python赋值运算符Python位运算符Python逻辑运算符Python成员运算符Python身份运算符Python运算符优先级嗨害大家好鸭&#xff01;我是小熊猫~ 源码资料电子书:点击此…

【软考——系统架构师】UML 建模与架构文档化

&#x1f50e;这里是【软考——系统架构师】&#xff0c;关注我考试轻松过线 &#x1f44d;如果对你有帮助&#xff0c;给博主一个免费的点赞以示鼓励 欢迎各位&#x1f50e;点赞&#x1f44d;评论收藏⭐️ 文章目录UML 基础UML 软件开发过程系统架构文档化送书福利UML 基础 U…

【2.27】动态规划、MySQL锁,基础篇、Redis

执行一条 select 语句&#xff0c;期间发生了什么&#xff1f; MySQL 执行流程是怎样的&#xff1f; MySQL 的架构共分为两层&#xff1a;Server 层和存储引擎层。 Server 层负责建立连接、分析和执行 SQL。MySQL 大多数的核心功能模块都在这实现&#xff0c;主要包括连接器&…

MyBatis - 07 - MyBatis的各种查询功能

文章目录项目 结构SelectMapper接口SelectMapper.xmlSelectMapperTest测试类测试结果1、查询一个实体类对象&#xff08;1.根据id查询用户信息&#xff09;2、查询一个list集合&#xff08;2.查询所有用户信息&#xff09;3、查询单个数据&#xff08;3.查询用户信息的总记录数…

Datawhale统计学习方法打卡Task05

学习教材《统计学习方法&#xff08;第二版&#xff09;》李航 学习内容&#xff1a;第5章 决策树 第五章 决策树 决策树是一种基本你的分类与回归方法。决策树模型呈树形结构&#xff0c;在分类问题中&#xff0c;表示基于特征对实例进行分类的过程。通过ID3和C4.5介绍特征…

测试开发工程师,年薪100W不过分吧

在说测试开发工程师的薪资待遇之前&#xff0c;咱们要先了解软件测试岗位是用来做什么的&#xff0c;岗位是否重要&#xff0c;只有你知道了这些&#xff0c;才能判断这个岗位是否有价值&#xff01;软件测试是依据需求分析和测试用例&#xff0c;运用手工和自动化的手段来验证…