MySQL_SQL优化

news2024/11/24 16:09:13

SQL优化

插入数据优化

  1. 顺序插入代替乱序插入

    data:1,2,3,4,5,6,7
    data:4,3,1,6,5,2,7
    
  2. 批量插入代替单个数据插入

    INSERT INTO `test` VALUES (1000, '软件工程-1000');
    INSERT INTO `test` VALUES (10000, '软件工程-10000');
    INSERT INTO `test` VALUES (100000, '软件工程-100000');
    
    INSERT INTO `test` VALUES (1, '软件工程-1'),(10, '软件工程-10'),(100, '软件工程-100');
    
  3. 手动控制事务

    start transaction;
    	INSERT INTO `test` VALUES (1000, '软件工程-1000');
        INSERT INTO `test` VALUES (10000, '软件工程-10000');
        INSERT INTO `test` VALUES (100000, '软件工程-100000');
    commit;
    
  4. load 指令加载大数据量

    • 命令行

      • 客户端连接服务端时,加上参数 -–local-infile

        mysql –-local-infile -u root -p
        
      • 启动从本地加载文件开关

        select @@local_infile 查看开关是否打开
        set global local_infile = 1;
        

        在这里插入图片描述

      • 执行load指令将准备好的数据,加载到表结构中

        load data local infile '文件路径' into table table_name fields terminated by ',' lines terminated by '\n' ;
        
      • 实操(注意,不要去用中文路径)

        load data local infile 'D:\\mysql\\课件\\配套资料\\sql优化\\load_1000w.txt' into table test fields terminated by ',' lines terminated by '\n';
        

主键优化

  1. 刚才提到了顺序插入代替乱序插入,这是为啥尼

  2. 数据组织方式:

    • innodb 主键是按顺序存放的,乱序插入会导致页分裂

    • 顺序插入在这里插入图片描述

    • 乱序插入出现页分裂的问题(页的元素没有顺序插入)
      在这里插入图片描述

    • 页合并
      在这里插入图片描述

  3. 设计主键的原则

    • 去使用自动递增(AUTO_INCREMENT)可以顺序插入,避免页分裂
    • 不要去使用 UUID,电话号码做为主键
    • 不要去修改主键

Order By优化

  1. mysql 排序:

    • Using filesort:通过扫描索引或者全表,读取满足的条件行,在排序缓冲区sort buffer 中的,性能低

    • Using index:通过有序索引顺序扫描直接返回有序结果,不需要额外排序,性能高

    • 优化具体操作:

      • 不建立索引的时候
        在这里插入图片描述
      • 建立索引时
        在这里插入图片描述
      • 给两个字段做升序排序 在这里插入图片描述
      • 建立联合索引时 在这里插入图片描述
      • 一个字段升序,一个字段降序(这里只能使用sql进行创建,因为navicat目前还没有索引排序功能)
        create index ix_p_a on user(phone,age desc)
        
        在这里插入图片描述 在这里插入图片描述
      • 两个字段都降序排列 在这里插入图片描述
  2. 优化原则

    • 排序字段需要建立合适索引,多字段排序,建立联合索引
    • 一个升序一个降序,创建索引的时候要去指定排序规则
    • 如果必须使用 filesort,数据量比较大的时候,可以去增大排序缓冲区的大小 sort_buffer_size(256K)

Group by优化

  1. 索引对于分组的影响
    • 没有建立索引的时候(使用临时表分组)在这里插入图片描述
    • 建立索引的时候 在这里插入图片描述
    • 多字段分组 在这里插入图片描述
    • 建立联合索引后需要遵循最左匹配原则 在这里插入图片描述 在这里插入图片描述
  2. 优化
    • 分组时,也要建立相关索引
    • 使用联合索引时,也遵循最左原则

limit 优化

  1. 如果数据量很大的时候,limit 分页查询,越往后速度越慢,效率越低。

  2. 查询 test 表中,第900万页的20条数据
    在这里插入图片描述

  3. 如何优化 在这里插入图片描述 在这里插入图片描述

  4. limit 优化

    • 通过创建索引,覆盖索引可以提升性能
    • 通过连接查询方式,相当于把查询到的结果作为临时表在进行查询

count 优化

  1. 查询表中的数据量

    select count(*) from tablename
    
  2. 不同存储引擎

    • innodb count(*) 需要一行一行的从数据库读取数据,累加结果
    • MyiSAM 存储的时候存放了一个总条数的值,直接拿,效率很高。做条件查询的时候,也很慢
  3. count 用法

    • count(*) 不需要取值
    • count(主键) 遍历整张表,取id 值
    • count(数字) 不需要取值
    • count(字段) 需要取值,并且还需要判断是否为空
  4. 排序效率

    count(*)=count(1) > count(主键) > count(字段)
    

update 优化

  1. innodb 引擎有三大特征

    • 事务
    • 外键
    • 行级锁
  2. 演示注意点

    1. 如果使用id(主键操作的时候)是可以成功的

      update user set user_name = 'xx' where id = 1;
      
      update user set user_name = '3' where id = 3;
      
    2. 更新名字为曹操的这条数据,把电话号码改成1,再去更新id=4 的数据,把电话号码也改成1

      update user set phone = '1' where user_name = '曹操';
      update user set phone = '1' where id = 4;
      出现阻塞的状态
      

      在这里插入图片描述

  3. 优化点

    • innodb 的行锁是针对于索引加的锁,并不是记录加的锁,如果没有索引或者是索引失效,将导致行锁升级为表锁

三范式总结

  1. 第一范式:有主键,具有原子性,字段不可分割
  2. 第二范式:完全依赖,没有部分依赖
  3. 第三范式:没有传递依赖

注意:实际开发中,不是完全遵循三范式,会经常使用冗余字段的。

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

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

相关文章

普通人怎样拥抱AI时代?这几点最为重要!

一、拒绝还是接受? 当纽约公立学校严禁学生用ChatGPT写论文之后,沃顿商学院的教授Ethan Mollick却开始鼓励自己的学生用ChatGPT来写论文。 图源于网络 试想一下,当所有学生都可以用ChatGPT写论文,大家的分数会有明显差别吗?一定…

Java中声明,定义,分配内存,初始化,赋值,是啥?

一. 声明,定义和分配内存 在Java中,声明和定义是同一个意思,不做区分。下面这些都是声明(定义)一个变量。 栈:存放局部变量(包括基本数据类型的变量和对象的引用) 堆:存…

Expo项目 使用Native base UI库

装包: yarn add native-base expo install react-native-svg12.1.1 Index.js: import React from react import { View, Text } from react-native import useList from ./useList import { NativeBaseProvider, Button, Box } from native-base import styles f…

「C/C++」C/C++可变参数函数

✨博客主页何曾参静谧的博客📌文章专栏「C/C」C/C程序设计📚全部专栏「UG/NX」NX二次开发「UG/NX」BlockUI集合「VS」Visual Studio「QT」QT5程序设计「C/C」C/C程序设计「Win」Windows程序设计「DSA」数据结构与算法「File」数据文件格式 目录 当你需要…

机器学习深度学习——seq2seq实现机器翻译(详细实现与原理推导)

👨‍🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习&&深度学习——seq2seq实现机器翻译(数据集处理) 📚订阅专栏:机器学习&…

明月之刃:armbian巧借nmtui管理网络连接

文章目录 nmtui简介安装nmtuinmtui使用连接wifi设置主机名称 nmtui简介 nmtui是NetworkManager TUI(Text User Interface)的缩写,它提供了一个可视化的界面来管理网络连接。但是,在Debian系统中,没有默认安装nmtui工具…

Vue电商项目--组件通信

组件通信6种方式 第一种:props 适用于的场景:父子组件通信 注意事项: 如果父组件给子组件传递数据(函数):本质其实是子组件给父组件传递数据 如果父组件给子组件传递的数据(非函数&#xf…

SpringBoot3集成Quartz

标签:Quartz.Job.Scheduler; 一、简介 Quartz由Java编写的功能丰富的开源作业调度框架,可以集成到几乎任何Java应用程序中,并且能够创建多个作业调度; 在实际的业务中,有很多场景依赖定时任务&#xff0c…

438. 找到字符串中所有字母异位词---字典匹配滑动窗口才是最优解

438. 找到字符串中所有字母异位词 原题链接:完成情况:解题思路:一开始字典匹配 参考代码:错误傻逼代码AC代码 原题链接: 438. 找到字符串中所有字母异位词 https://leetcode.cn/problems/find-all-anagrams-in-a-st…

CUDA执行模型

一、CUDA执行模型概述 二、线程束执行 1. 线程束与线程块 线程束是SM中基本的执行单元。 当一个线程块的网格被启动后,网格中的线程块分布在SM中。 一旦线程块被调度到一个SM中,线程块中的线程会被进一步划分成线程束。 一个线程束由32个连续的线程…

week4刷题

题解: F(n)F(n−1)F(n−2) 由于斐波那契数存在递推关系&#xff0c;因此可以使用动态规划求解。动态规划的状态转移方程即为上述递推关系&#xff0c;边界条件为 F(0)F(0)F(0) 和 F(1)F(1)F(1)。 class Solution { public:int fib(int n) {int MOD 1000000007;if (n < 2)…

Nginx 安装与部署

文章和代码已经归档至【Github仓库&#xff1a;https://github.com/timerring/front-end-tutorial 】或者公众号【AIShareLab】回复 nginx 也可获取。 文章目录 虚拟机安装CentOS7.4Linux配置配置上网配置静态ip Nginx的安装版本区别备份克隆 安装编译安装报错解决 启动Nginx防…

SpringBoot+Mybatis-Plus实现增删改查超详细步骤

目录 一、介绍 二、前期准备工作 &#xff08;一&#xff09; 创建springboot项目和创建数据库 三、项目配置 &#xff08;一&#xff09;pom.xl导入相关依赖 1.导入依赖 &#xff08;二&#xff09;yml文件中配置连接数据库 2.配置yml文件 四、代码的编写 数据库展…

阿里云FRP内网穿透挂载多台服务器

1. FRP介绍 FRP (Fast Reverse Proxy) 是比较流行的一款。FRP 是一个免费开源的用于内网穿透的反向代理应用&#xff0c;它支持 TCP、UDP 协议&#xff0c; 也为 http 和 https 协议提供了额外的支持。你可以粗略理解它是一个中转站&#xff0c; 帮你实现 公网 ←→ FRP(服务器…

vue复习。从安装到使用

vue官网&#xff1a;cn.vuejs.org vue安装 cnpm install -g vue/cli 查看是否安装成功 vue --version 创建一个项目 vue create vue-demo(项目名称) 这个取消掉。空格可选中或者取消。 运行项目&#xff1a; cd 进入到项目下 npm run serve 运行成功后&#xff0c;访问这…

Leetcode 21. 合并两个有序链表

题目描述 题目链接&#xff1a;https://leetcode.cn/problems/merge-two-sorted-lists/description/ 思路 两个链表都是升序链表&#xff0c;新建一个链表&#xff0c;引入伪头节点作为辅助节点&#xff0c;将各节点添加到伪节点之后&#xff0c;再用一个cur节点指向新链表的…

【C语言练习】——找出单身狗、详解atoi函数

目录 一.找出单身狗版本1版本2 二.atoi函数介绍atoi函数atoi函数的模拟实现 一.找出单身狗 版本1 题目&#xff1a; 一个数组中只有一个数字是出现一次&#xff0c;其他所有数字都出现了两次 找出这一个只出现一次的数字 一个数组比如是1、2、3、4、5、1、2、3、4 只有5出现一…

【力扣每日一题】2023.8.13 合并两个有序数组

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目给我们两个升序数组&#xff0c;让我们合并它们&#xff0c;要求合并之后仍然是升序&#xff0c;并且这个合并操作是在数组1原地修改…

前沿分享-中距离射频取电

目前来看&#xff0c;微能源有四种技术路线&#xff0c;一是环境光采集、温差转换采集、无线射频采集和振动能量采集。 无线射频微能源是在通信设备通信过程中自然产生的&#xff0c;可以通过射频能量芯片实现无线射频取电&#xff0c;能瞬间大功率储电和安全驱动负载。 通过射…

基于微信小程序的应届大学生招聘平台的设计与实现

伴随着社会以及科学技术的发展&#xff0c;互联网已经渗透在人们的身边&#xff0c;网络慢慢的变成了人们的生活必不可少的一部分&#xff0c;紧接着众多智能手机飞速的发展&#xff0c;小程序这一名词已不陌生&#xff0c;越来越多的企业、公司、高校、医院等机构都会使用小程…