MySQL进阶- SQL优化和视图

目录

  • SQL优化
    • 插入数据时的SQL优化(insert优化,和大批量数据插入)
    • 主键优化
    • order by优化(排序操作的优化)
    • group by优化(分组优化)
    • limit优化(分页查询优化)

SQL优化

插入数据时的SQL优化(insert优化,和大批量数据插入)

  • 批量插入
    在插入多条数据时,不要一句一句的SQL语句插入,而是一次性插入多条数据

    INSERT INTO 表名  (字段名1,字段名2...) VALUES (值一,值二,...),(值一,值二,...),(值一,值二,...);``
    INSERT INTO 表名 VALUES (值一,值二,...),(值一,值二,...),(值一,值二,...);``
    

    但是批量插入一次最多不要超过1000条,大概就是500到1000条,如果一次性要插入几万条数据,那么可以将其分为多条insert语句插入

  • 手动提交事务
    可以优化插入速度,在插入前手动开启事务,插入完成后手动结束事务

    start transaction;
    insert into 表名 values(具体数据1);
    insert into 表名 values(具体数据2);
    insert into 表名 values(具体数据3);
    ...
    commit;
    
  • 主键顺序插入
    在插入主键时按照主键的顺序插入
    在这里插入图片描述

  • 大批量插入数据
    如果一次性插入大批量数据(万级的),使用insert语句插入性能较低,此时可以使用MySQL提供的load指令插入,通过load指令可以将本地磁盘中的数据全部加载到数据库当中
    在这里插入图片描述
    使用load指令的步骤:
    1.在客户端连接服务端的时候,加上参数 – local-infile

    mysql--local-infile -u root -p
    

    2.设置全局参数local_infile为1,开启从本地加载文件导入数据的开关

    set global local infile=1;
    

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

    -- 这里的'/root/sql1.log'是本地文件
    -- fields teminated by ',':表示每一个字段之间使用 , 分割
    -- lines teminated by '\n';表示每一行数据之间使用 \n 分割
    load data local infile '本地文件' into table '表名' fields teminated by ',' lines teminated by '\n';
    

    在这里插入图片描述

    可以看到,默认情况下local_infile这个全局变量是关闭的
    在这里插入图片描述

    在这里插入图片描述
    注意这里插入数据时,由于是虚拟机,所以要现在finalshall中上传数据,把数据上传到虚拟机中
    在这里插入图片描述
    这里插入100万条数据只需要耗时16秒,很强

    使用load插入时也需要主键顺序插入,顺序插入数据高于乱序插入

    主键顺序插入性能高于乱序插入

主键优化

  • InnoDB中数据的组织方式:

    在InnoDB中,表的数据都是根据主键的顺序组织存放的,这种存储方式被称为索引组织表。(即每行数据在页中都是顺序存放)
    在这里插入图片描述
    page(页)是innoDB磁盘管理的最小单元,一个extent(区)中可以包含64个页

  • 页分裂
    页可以为空,也可以填充一半,也可以全部填满,但是一个页中最少包含2行数据,如果某行的数据较大,超出了页的阈值之后,就会出现行溢出的现象,

    如果顺序插入,就不会出现页分裂,乱序插入就会出现页分裂的现象,导致插入时要多操作页,自然插入的时间就会变长

  • 页删除
    在InnoDB中当删除一行数据时,实际上数据并没有被物理删除,而是数据被标记为删除并且他的空间变的允许其他数据使用

    在这里插入图片描述

    上图的13,14,15,16就是打上删除的标记了

    当页中删除的数据达到一个阈值(MERGE_THRESHOLD)时(默认为页的50%),innoDB会开始寻找最靠近的页(前或后面的页)看看是否可以将两个页进行合并以优化空间使用

    达到阈值在这里插入图片描述
    然后合并
    在这里插入图片描述
    再插入数据时就会往下一个页中插入数据
    这里阈值(MERGE_THRESHOLD)可以自己设置,默认为50%

  • 主键的设计原则
    满足业务需求的情况下,尽量降低主键的长度

插入数据时,尽量使用顺序插入,尽量使用auto_increment自增主键

尽量不要使用UUID做主键或者其他自然主键(如身份证号)

业务操作时,尽量避免对主键的修改

order by优化(排序操作的优化)

MySQL中的两种排序方式
在这里插入图片描述
using index的效率较高

-- 此时age和phone都没有索引,使用order by排序时都是Using filesort,效率较低
mysql> explain select id,age ,phone from tb_user_s1 order by age;
+----------------+| Extra          |
+----------------+
| Using filesort |
+----------------+
1 row in set, 1 warning (0.00 sec)mysql> explain select id,age ,phone from tb_user_s1 order by age,phone;
+----------------+| Extra          |
+----------------+
| Using filesort |
-+----------------+
1 row in set, 1 warning (0.00 sec)-- 为age和phone建立联合索引后,就会变为Using index-- 若在查询时,order by之后的联合索引的排序不同,例如,一个顺序,一个倒序,
-- 也会出现Using filesort的情况
-- 这里age升序排列,phone倒序排列
select id,age ,phone from tb_user_s1 order by age asc,phone desc;-- 这种情况的解决方式就是在创建联合索引时就把顺序定好
-- 下面就是在创建联合索引时就确定age和phone的排列方式
create index idx_user_age_phone_ad on tb_user_s1(age asc ,phone desc)

在这里插入图片描述
在这里插入图片描述

注意:上述的所有排序优化都有一个条件,就是覆盖索引,如果不是覆盖索引就不行

  • 即order by优化主要就以下几点:
  1. 根据排序字段建立合适的索引,多字段排序时,也遵循最左前缀法则
  2. 尽量使用覆盖索引
  3. 多字段排序,一个升序一个降序,此时需要注意联合索引在创建时的规则
  4. 如果不可避免的出现filesort,大数据量排序时,可以适当增大排序缓冲区大小sort_buffer_size(默认为256k)

group by优化(分组优化)

在分组操作时,建立适当的索引来提升效率
在这里插入图片描述
没有索引时,直接分组效率是较低的,使用索引对分组进行优化的话,就尽量使用联合索引,注意联合索引的最左前缀法则

在分组操作时,索引的使用也是需要满足最左前缀法则的

limit优化(分页查询优化)

limit一个常见的问题就是,在大数据量的情况下,越往后查询数据,limit的效率月底,例如limit 2000000,10,此时需要mysql排序前2000010记录,但是仅仅返回2000000和2000010之间的记录,其他的记录丢弃,查询排序的代价非常大

官方给出的优化方式是,通过覆盖索引和子查询的方式优化

-- 直接使用limit查询,效率很低,大概要19秒多
select *from tb_user_s2 limit 9000000,10;-- 使用覆盖索引和子查询的方式优化
-- 先在子查询中找到对应的主键,然后再使用主键进行查询数据
-- 但是这种方式好像在mysql8.0.26语法不支持
select * from tb_user_s2 where id in(select id from tb_user_s2 order by in limit 9000000,10);-- 那么可以使用另外的语法实现这个效果
-- 把select id from tb_user_s2 order by in limit 9000000,1
-- 返回的结果看成一张表,然后使用多表查询
select s.* from tb_user_s2 s, (select id from tb_user_s2 order by in limit 9000000,10) a where a.id=s.id;
-- 这样写大概查询是10秒,提高9秒的效率

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

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

相关文章

网吧台式计算机配置,详细推荐一套网吧电脑配置

让我向您介绍2020年电脑网吧配置和价格的知识,希望对您有所帮助: 1.适合入门玩家的组装计算机配置 2.适用于主流游戏玩家的组装计算机的配置说明:该主机更适合入门级游戏玩家。尽管双核四线程奔腾G4560是上一代产品,但在性价比方面…

游戏计算机性能要求,解答玩大型游戏的电脑配置

玩电脑大型游戏对于配置有什么要求呢?大家都知道,电脑分为硬件系统和软件系统,而硬件是电脑的基础,大型游戏又属于高端级别的游戏,对于硬件的选择更要多加考虑。我给大家带来了一些大型游戏所需电脑配置,大家可以参考一下 随着网络的发展,大家越来越不开电脑,工作学习娱…

html需要电脑什么配置,玩大型游戏需要什么电脑配置?大型游戏电脑配置推荐...

大型游戏电脑配置主要是看CPU和显卡,CPU酷睿I5 8代以上,amd锐龙5以上配置都算比较高的配置了,当然I7 8代更好,显卡GTX960以上,比如玩大型游戏吃鸡GTX960就很勉强,只能开低质量画面玩,其他的硬盘…

实时游戏计算机配置,怎么知道自己的电脑配置可以玩那些游戏?

很多电脑小白都不知道自己的电脑到底能玩哪些游戏,然后就会在贴吧、百度知道、知乎等等网站上进行提问“我的电脑配置能玩那些游戏呢?”这种问题,然后就会得到各路大神的解答,有说你的配置不能玩的,同时也有说你的配置…

组装电脑配置清单2023 组装电脑配置推荐2023

3000元组装电脑配置清单 CPU Intel 酷睿i3 10105F 1 560 主板 微星H510M BOMBER 1 529 内存 芝奇Ripjaws V 8GB DDR4 3200(F4-3200C16S-8GVKB) 组装电脑怎么搭配更合适这些点很重要看过你就懂了 http://www.adiannao.cn/du 硬盘 东芝1TB 7200转 32MB …

玩计算机组装,2000玩LOL组装电脑清单(组装一台玩lol的电脑配置)

2000玩LOL组装电脑清单,不知不觉就2020下半年了,特殊年时间过的真快,前几天有网友咨询,2000元组装一套玩LOL的组装电脑,还要带显示器,这预算可以说是白菜价了,今天装机100网就利用早上一点时间,整理几份2000元左右的电脑清单,大家可以看看! 配置一:2000元左右玩英雄…

win10dnf服务器未响应,win10专业版dnf老是未响应是什么原因?电脑配置没问题呀

我们在操作 win10专业版电脑的时候,常常会遇到win10专业版dnf老是未响应的问题每个人都有不同的操作门路,网友反应自己的dnf老是未响应是什么原因?电脑配置没问题呀!为此小编在大量的搜集dnf老是未响应的解法之后,总结出来一套比较... 针对此问题小编给大家收集整理的问题&…

玩游戏计算机配置,玩大型游戏需要什么配置

随着科技的发展,电脑配置也在不断地升级,当然,我们玩的大型游戏对配置大要求也是越来越高。很多朋友想要购买电脑玩一些电脑游戏时该如何选择电脑配置呢?接下来就给大家介绍一下玩大型游戏所需的电脑配置。 玩大型游戏主要电脑配置如何选择 …

地下城与勇士M如何用电脑玩 地下城与勇士M电脑版教程

《地下城与勇士M》是一款根据端游同款游戏改编而来的冒险挑战类手机游戏。在这个暗黑的世界之中,你需要化身为一个超级无比的勇士,你不仅仅需要拥有超级震撼的完美炫斗技能大招,简单畅爽的操作,带你在高度自由的炫斗世界之中展现出…

ElasticSearch安装部署——超详细

ElasticSearch安装部署 简介 全文搜索属于最常见的需求,开源的 Elasticsearch (以下简称 es)是目前全文搜索引擎的首选。 它可以快速地储存、搜索和分析海量数据。维基百科、Stack Overflow、Github 都采用它。 Elasticsearch简称es&…

ARC学习(1)基本编程模型认识

笔者有幸接触了arc处理器,今天就来简单了解一下arc的编程模型 1、ARC基本认识 ARC IP是synopsys 新思公司开发的一个系列ARC IP核,其是一家电子设计自动化(EDA)解决方案提供商。其主页地址在这里!业务主要如下&#x…

Mac电脑怎么同时登录两个微信账号

终端执行 nohup /Applications/WeChat.app/Contents/MacOS/WeChat > /dev/null 2>&1 & 加了&会显示进程号

怎么在mac上登录两个微信

在已经登录了一个微信的情况下,打开终端输入 nohup /Applications/WeChat.app/Contents/MacOS/WeChat > /dev/null 2>&1然后就可以打开另一个微信的登录界面了,直接扫码登录即可

两部手机还能同时登录1个微信号!这个操作你知道吗?

在上班的时候我们可以看到有不少朋友都会自带两部手机,主要是为了区分工作与生活,但是在登录微信的时候有不少朋友都会遇到这样的问题,一个微信账号可以在两个手机上登录吗?今天就来教怎样同时登录两个微信账号。 一、使用手机号登…

如何实现微信多开,苹果手机无需越狱

I. 前言 本文的前言部分主要介绍了研究背景、研究目的、研究内容和研究方法。其中研究背景介绍了微信双开的概念和应用,并指出苹果手机的微信双开是一个热门话题。研究目的是为了探究苹果手机上微信双开的可行性和实现方法。研究内容包括系统架构设计、模块功能设计…

如何在一个电脑上同时登录两个微信?

今天给大家分享一个使用小技巧,众所周知微信电脑端只可以登录一个,如果我们有好几个微信怎么同时登录电脑端呢? windows平台为例,在一个自己找得到的位置,新建.bat结尾的文件,文件内容如下: s…

一个手机里登录2个微信号(微信双开)

正常来说,使用微信的客户端,一个手机只能登录一个微信号。 所以,另一个微信号就需要第三方的工具来实现。 我的环境:android (苹果的APPStore 好像没有我使用的这款软件) 重点来了,这是款免费的…

一个手机同时登录多个微信。

请登录google play搜索 fanxp.multiapp 下载。 没有安装google play的朋友可通过关注腾讯或者新浪微博MultiApp上公布的下载链接下载app。 最新消息请关注微博更新。 最新微信多帐号下载地址:http://m1.multiapp.cn 也可以通过扫描二维码下载:

如何使用一个手机号注册两个微信号!

大家都知道,现在的微信更新以后手机就不能解绑了,只能换绑,有很多时候我们需要两个微信号,特别是做销售和做微商的朋友,难道我们必须再专门买一个手机卡养着吗,尤其对于苹果用户来说,两个卡就意…

手机第二个微信怎么弄 手机如何弄两个微信 手机弄两个微信方法

手机如何弄两个微信很多朋友在使用中都存在这个疑惑, 那就来看看小编为大家分享的手机弄两个微信方法说明,感兴趣的朋友可以了解一下哦~ 1、在手机桌面找到设置 点击打开 2、在设置里面找到应用与权限(不同安卓手机不同选项,大…