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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 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.视图的作用


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


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


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


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
19天前
|
SQL 关系型数据库 MySQL
MySQL慢查询优化、索引优化、以及表等优化详解
本文详细介绍了MySQL优化方案,包括索引优化、SQL慢查询优化和数据库表优化,帮助提升数据库性能。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
MySQL慢查询优化、索引优化、以及表等优化详解
|
18天前
|
SQL 缓存 监控
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
本文详细解析了数据库、缓存、异步处理和Web性能优化四大策略,系统性能优化必知必备,大厂面试高频。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
|
1天前
|
SQL 存储 关系型数据库
MySQL进阶突击系列(01)一条简单SQL搞懂MySQL架构原理 | 含实用命令参数集
本文从MySQL的架构原理出发,详细介绍其SQL查询的全过程,涵盖客户端发起SQL查询、服务端SQL接口、解析器、优化器、存储引擎及日志数据等内容。同时提供了MySQL常用的管理命令参数集,帮助读者深入了解MySQL的技术细节和优化方法。
|
27天前
|
SQL 存储 缓存
如何优化SQL查询性能?
【10月更文挑战第28天】如何优化SQL查询性能?
87 10
|
24天前
|
缓存 监控 关系型数据库
如何优化MySQL查询速度?
如何优化MySQL查询速度?【10月更文挑战第31天】
56 3
|
26天前
|
SQL 存储 缓存
SQL Server 数据太多如何优化
11种优化方案供你参考,优化 SQL Server 数据库性能得从多个方面着手,包括硬件配置、数据库结构、查询优化、索引管理、分区分表、并行处理等。通过合理的索引、查询优化、数据分区等技术,可以在数据量增大时保持较好的性能。同时,定期进行数据库维护和清理,保证数据库高效运行。
|
26天前
|
缓存 关系型数据库 MySQL
如何优化 MySQL 数据库的性能?
【10月更文挑战第28天】
52 1
|
2月前
|
NoSQL 关系型数据库 MySQL
MySQL与Redis协同作战:百万级数据统计优化实践
【10月更文挑战第21天】 在处理大规模数据集时,传统的单体数据库解决方案往往力不从心。MySQL和Redis的组合提供了一种高效的解决方案,通过将数据库操作与高速缓存相结合,可以显著提升数据处理的性能。本文将分享一次实际的优化案例,探讨如何利用MySQL和Redis共同实现百万级数据统计的优化。
80 9
|
28天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
155 1
|
2月前
|
NoSQL 关系型数据库 MySQL
MySQL与Redis协同作战:优化百万数据查询的实战经验
【10月更文挑战第13天】 在处理大规模数据集时,传统的关系型数据库如MySQL可能会遇到性能瓶颈。为了提升数据处理的效率,我们可以结合使用MySQL和Redis,利用两者的优势来优化数据查询。本文将分享一次实战经验,探讨如何通过MySQL与Redis的协同工作来优化百万级数据统计。
63 5