15天学习MySQL计划-SQL优化/视图(进阶篇)-第八天

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: 15天学习MySQL计划-SQL优化/视图(进阶篇)-第八天

SQL优化

1.插入数据(insert)

1.批量插入

insert into 表名 values(值1,值2),(值1,值2),(值1,值2),(值1,值2)

2.手动提交事务

1. --查看当前提
--查看当前提交的状态
select @@autocommit;
--0代表手动提交  1代表自动提交
set @@autocommit = 0;
commit  #提交事务

3.主键顺序插入

主键值有序插入

4.大批量插入数据

如果一次性需要插入大批量数据,使用insert语句插入性能较低,此时可以使用MySQL数据库提供的load指令来进插入 方法如下。

#客户端连接服务端时,加上参数 --local-infile
mysql --local-infile -uroot -p
#设置全局参数local_infile为1,开启从本地加载文件导入数据的开关
set global local_infile=1;
#执行load指令将准备好的数据,加载到表结构中
load date local infile '/root/sql1.log' into table `tb_user` fields terminated by ',' lines terminated by '\n';
解释:
'/root/sql1.log':数据存放位置
`tb_user`:插入的表名
 ',':每一个数据直接的分隔符
 '\n':每一行之间的分隔符

2.主键优化

1.数据组织方式

2.页分裂


页可以为空,也可以填充一半,也可以填充100%。每个页包含了2-N行数据(如果一行数据多大,会行溢出),根据主键排列。


a750a5672b8a4cbe9df2f3cb9c0e4b8e.png


3.页合并


当删除一行记录时,实际上记录并没有被物理删除,只是记录被标记(flaged)为删除并且它的空间变得允许被其他记录声明使用。


当页中删除的记录达到merge_threshold(默认为页的50%),linnodb会开始寻找最靠近的页(前或后)看看是否可以将两个页合并以优化空间使用。

f173f134a3754f4da9b02bf2c4ac2abe.png


3251d8dfaa4644218a8eb07293ef16b3.png


MERGE_THRESHOLD:合并页的阈值,可以自己设置,在创建表或者创建索引时指定。


4.主键设计原则


满足业务需求的情况下,尽量降低主键的长度


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


尽量不要使用UUID做主键或者是其他主键,如身份证号


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


3.order by优化


using filesort:通过表的索引或全表扫描,读取满足条件的数据行,然后在排序缓冲区sort buffer中完成排序操作,所有不是通过索引直接返回排序结果的排序都叫using filesort排序。


using index:通过有序索引顺序扫描直接返回有序数据,这种情况即为using index,不需要额为排序,操作效率高。


1e6f5472471543ba9eb8397cf7f59dcb.png


排序创建


c1066d4b91204c1d8399fb9b10d175cb.png


设置排序数据索引排序过程


2dc9d59c56264ed5a4f399b866302396.png


排序优化理念


根据排序字段建立合适的索引,多字段排序时,也遵循最左前缀法法则。


尽量使用覆盖索引


多字段排序,一个升序一个降序,此时需要注意联合主键索引在创建时的规则(ASC/DESC)


如果不可避免出现filesort,大数据量排序时,可以适当增大排序缓冲区大小sort_buffer_size(默认256K)


4.group by优化


在分组操作时,可以通过索引来提高效率。


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


40d914d2d7c741c8a0cffdb8de3ad710.png


5.limit优化


一个常见又非常头疼的问题就是limit 2000000,10 ,此时需要MySQL排序前200010记录,仅仅返回200000 - 200010的记录,其他记录丢弃,查询排序的代价非常大。


优化思路:一般分页查询时,通过创建覆盖索引能够比较好的提高性能,可以通过覆盖索引加子查询形式进行优化


9f9df0259a6c4eed9fc19a465c448c11.png


6.count优化


88c1baeb8556477ea0bc5a7a7f5b9d44.png

MyISAM引擎把一个表的总行数存在了磁盘上,因此执行count(*)的时候会直接返回这个数,效率很高;


innoDB引擎就麻烦了,它执行count(*)的时候,需要把数据一行一行的从引擎里面读出来,然后累积计数;


优化思路:自己计数


count优化


count()是一个聚合函数,对于返回的结果集,一行行地判断,如果count函数的参数不是null,累计值就加1,否则不加,然后返回累加值


用法:count(*) ,coun(主键),count(字段),coun(1)


1d282b4eb0e34ca78a1ad82f6a3473a4.png


7.update优化


在使用update进行更新字段的时候,使用索引字段来进行更新,非则会出现表锁。


innodb的行锁是针对索引加的锁,不是针对记录加的锁,并且该索引不能失效,否则会从行锁升级为表锁。


视图

1.视图的基本语法


视图(view)是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。


通俗的讲,视图只保存了查询的SQL逻辑,不保存查询结果。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。

格式:create [or replace] view 使命名称[(列名)] as select语句 [with [cascaded | local] chack option]
mysql> create or replace view emp_view as select * from emp;
or replace:当视图名存在时进行覆盖创建

2.查询

查看创建视图语句:show create view 视图名
查看视图数据:select * from 视图名称
mysql> show create view emp_view;
mysql> select * from emp_view;

3.修改视图

方法一:create [or replace] view 使命名称[(列名)] as select语句 [with [cascaded | local] chack option]
方法二:alter view 视图名称[(列名列表)] as select语句 [with [cascaded | local] chack option]
mysql> create or replace view emp_view as select * from emp limit 5;
mysql> alter view emp_view as select * from emp limit 5;

4.删除

drop view [if exists] 视图名称 [,视图名称]
mysql> drop view if exists emp_view;


2.视图检查选项


当使用with check option 子句创建视图时,MySQL会通过视图检查正在更改的每个行,例如插入,更新,删除,以使其符合视图的定义。MySQL允许基于另一个视图创建视图,它还会检查依赖视图中的规则以保持一致性。为了确定检查的范围,MySQL提供了两个选项:cascaded和local,默认值为cascaded。


cascaded:


在基于另一个视图创建另一个视图时,当你第二个视图创建了检查选项时(with check option),第一个如果没有创建,但是在插入第二个表时,必须要同时满足两个视图的条件,才可以进行插入修改,如果出现了三种表,第三章表没有设置检查选项则只会遵循前两种的条件。


42888883c1c9428fb6914b7c26c2634d.png


local:


在基于另一个视图创建另一个视图时,当你第二个视图创建了检查选项时(with check option),第一个如果没有创建,但是在插入第二个表时,只需要满足第二章表的条件,如果出现三种表,第三张表没有创建检查选项则只需要遵循第二张表的条件。


4c1009e088e34b5a9f831bbfe3e329a9.png


3.视图的更新要求


要使视图可更新,视图中的行与基础表中的行之间必须存在一对一的关系。如果视图包含一下任何一项,则该视图不可更新:


聚合函数或窗口函数(sum(),min(),max(),count()等)


distinct


group by


havign


union或者union all


4.视图的作用


简单:视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次指定全部的条件。


安全:数据库可以授权,但不能授权到数据库指定行和特定的列上。通过视图用户只能查询和修改他们所能见到的数据


数据独立:视图可以帮助用户屏蔽真实表结构变化带来的影响。


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1天前
|
存储 关系型数据库 MySQL
mysql optimizer_switch : 查询优化器优化策略深入解析
mysql optimizer_switch : 查询优化器优化策略深入解析
|
2天前
|
关系型数据库 MySQL 数据库
数据迁移脚本优化过程:从 MySQL 到 Django 模型表
在大规模的数据迁移过程中,性能问题往往是开发者面临的主要挑战之一。本文将分析一个数据迁移脚本的优化过程,展示如何从 MySQL 数据库迁移数据到 Django 模型表,并探讨优化前后的性能差异。
|
2天前
|
关系型数据库 MySQL 分布式数据库
PolarDB产品使用问题之 MySQL数据库中,执行delete命令删除数据后,存储空间通常不会立即释放,该如何优化
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
1天前
|
SQL 存储 数据库
sql优化提速整理
sql优化提速整理
|
1天前
|
存储 关系型数据库 分布式数据库
PolarDB产品使用问题之在将RDS迁移到PolarDB后,原先由root用户创建的视图、存储过程等是否可以继续使用的
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
1天前
|
SQL 存储 关系型数据库
1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server
1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server
|
1天前
|
关系型数据库 MySQL 数据库
深入OceanBase分布式数据库:MySQL 模式下的 SQL 基本操作
深入OceanBase分布式数据库:MySQL 模式下的 SQL 基本操作
|
2天前
|
关系型数据库 MySQL 数据库
MySQL索引优化:深入理解索引合并
MySQL索引优化:深入理解索引合并
|
2天前
|
存储 关系型数据库 MySQL
技术笔记:MySQL数据库优化详解(收藏)
技术笔记:MySQL数据库优化详解(收藏)
|
2天前
|
缓存 关系型数据库 MySQL
欢迎来到MySQL优化之旅
欢迎来到MySQL优化之旅
6 0