Mysql学习-sql优化

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 1. 选择优化的数据类型1)更小的通常更好:一般情况下,尽量使用可以正确存储数据的最小数据类型。2)简单就好:简单数据类型的操作通常需要更小的CPU周期3)尽量避免NULL:很多表都包含可为NULL(空值)的列,通常情况下最好指定为NOT NULL。因为如果查询中包含可为NULL的列,对于Mysql来说更难优化。

1. 选择优化的数据类型

1)更小的通常更好:一般情况下,尽量使用可以正确存储数据的最小数据类型。

2)简单就好:简单数据类型的操作通常需要更小的CPU周期

3)尽量避免NULL:很多表都包含可为NULL(空值)的列,通常情况下最好指定为NOT NULL。因为如果查询中包含可为NULL的列,对于Mysql来说更难优化。

4)选择具体的数据类型

使用枚举代替字符串类型,对于确切的分类类型,可以采用ENUM,而不是字符串类型,除此之外还可以在java代码中采用枚举。

2.三范式和反三范式混用

三范式和反三范式在实际项目中,通常是混用的,因为对于设计冗余字段,可以避免外键约束。

3..使用物化视图

预先计算并且存储在磁盘上的表,可以通过各种各样的策略刷新和更新。

4. Mysql索引

Mysql索引为什么会采用B+Tree,需要考虑以下几个问题:

对具体的数据可以快速搜索、如何快速查找区间数据、支持模糊查询、支持分页、支持排序(正序和逆序)。

解决第一个问题的方案:我们能快速想到的就是Hash,因为Hash采用函数的方式可以映射,有点类似f(x)=y这样,给定一个x的key,就会输出一个y的value。其定位为精确查找,而对于排序、模糊查询、区间匹配是不支持的,同时存在hash 冲突的情况,不能使用索引中的值来避免读取行。因此,在Mysql中,只有Memory引擎显式支持哈希索引,同时这也是Memory引擎表的默认索引类型。NDB集群索引支持唯一哈希索引。

考虑方案树tree,因为tree的时间复杂度是log2N,相比其他数据结构,其具有优越性,同时二叉查找树,其性能就会更好,因为其本身就带排序功能。但其不能保证平衡,因此就需要进一步考虑平衡树了,因此可以考虑红黑树、B树,因此进一步考虑B+树。B+树的优越性在于其可以解决排序、模糊查询、树的平衡、树的时间复杂度、分页等问题,因此采用B+树索引。同时按顺序存储的,并且每一个叶子页到根的距离都相等。

正是它的结构:因此其可以全值匹配、匹配最左前缀、匹配范围值等。

空间数据索引R-tree:在使用MyISAM引擎时,其支持空间索引,可以用作地理数据存储。

使用索引的优点:

索引大大减少了服务器需要扫描的数据量、帮助服务器避免排序和临时表、将随机I/O变为顺序I/O。通常对于中型和大型的表,索引就是十分有效的,而对于特大型的表,采用分区技术。

多列索引:通常的思路时将索引建立在where条件上,同时进行前缀匹配。也即:

对应组合索引index(A,B,C),采用前缀匹配,也即匹配到A,再会进行B、C的匹配,如果不匹配A,后面的索引是不会进行匹配的,只有匹配了A,后面的B、C才会进行匹配。索引可以按照升序或者降序进行扫描,以满足精确符合列顺序的order by、group by、district等子句的查询需求。

三星索引:索引将相关的记录放在一起则获得一星,如果索引中的数据顺序和排序顺序一致则获得二星,如果索引中的列包含了查询中需要的全部列则获得三星。

如何选择索引的列顺序的经验法则:将选择性最高的列发到索引最前列,在某些场景下有帮助,但通常不如避免随机I/O和排序那么重要。当不考虑排序分组时,将选择性最高的列放在前面通常是很好的 。这时候索引的作用只是用于WHERE条件的查找。考虑将选择性最高的作为索引的第一列,而不是某个具体的查询。

对于sql的优化:

1.通常如果查询中带有or的join时,可以考虑将其变成两个确切的sql进行UNION ALL,此时执行的效率比采用or要高得多。

2. 对于sql中采用年、月等截取sql时,可以考虑在程序中进行拼接,而不是在sql中采用sql函数获取,从而是一个确切的区间,从而提高效率。

3. 对于多个 join 可以考虑将其分解成多个sql子句,在程序中拼接,此时的效率比join的效率要高。

4. 采用sql的执行计划,对查询慢的sql子句进行优化。

5. 考虑采用延迟关联。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
8天前
|
SQL 存储 缓存
浅析MySQL中的SQL执行过程
本文探讨了MySQL的体系结构、SQL执行流程及SQL执行时间分析方法。首先介绍了MySQL由连接层、SQL层和存储引擎层构成;接着详细描述了SQL从客户端发送到服务器执行的具体流程;最后,通过启用profiling功能,展示了如何分析SQL执行时间,并说明了MySQL 8.0版本后移除查询缓存的原因。
浅析MySQL中的SQL执行过程
|
7天前
|
SQL 关系型数据库 MySQL
学习MySQL操作的有效方法
学习MySQL操作的有效方法
19 3
|
6天前
|
SQL 关系型数据库 MySQL
如何学习 MySQL?
如何学习 MySQL?
18 3
|
11天前
|
前端开发 C# 设计模式
“深度剖析WPF开发中的设计模式应用:以MVVM为核心,手把手教你重构代码结构,实现软件工程的最佳实践与高效协作”
【8月更文挑战第31天】设计模式是在软件工程中解决常见问题的成熟方案。在WPF开发中,合理应用如MVC、MVVM及工厂模式等能显著提升代码质量和可维护性。本文通过具体案例,详细解析了这些模式的实际应用,特别是MVVM模式如何通过分离UI逻辑与业务逻辑,实现视图与模型的松耦合,从而优化代码结构并提高开发效率。通过示例代码展示了从模型定义、视图模型管理到视图展示的全过程,帮助读者更好地理解并应用这些模式。
27 0
|
11天前
|
SQL 关系型数据库 MySQL
|
11天前
|
Java XML Maven
跨越时代的飞跃:Struts 2 升级秘籍——从旧版本无缝迁移到最新版,焕发应用新生!
【8月更文挑战第31天】随着软件技术的发展,Struts 2 框架也在不断更新。本文通过具体案例指导开发者如何从旧版平滑升级到 Struts 2.6.x。首先更新 `pom.xml` 中的依赖版本,并执行 `mvn clean install`。接着检查 `struts.xml` 配置,确保符合新版本要求,调整包扫描器等设置。审查 Action 类及其注解,检查配置文件中的弃用项及插件。更新自定义拦截器实现,并验证日志配置。最后,通过一系列测试确保升级后的系统正常运行。通过这些步骤,可以顺利完成 Struts 2 的版本升级,提升应用的安全性和性能。
37 0
|
11天前
|
SQL 存储 数据库
|
11天前
|
SQL 数据管理 关系型数据库
SQL与云计算:利用云数据库服务实现高效数据管理——探索云端SQL应用、性能优化、安全性与成本效益,为企业数字化转型提供全方位支持
【8月更文挑战第31天】在数字化转型中,企业对高效数据管理的需求日益增长。传统本地数据库存在局限,而云数据库服务凭借自动扩展、高可用性和按需付费等优势,成为现代数据管理的新选择。本文探讨如何利用SQL和云数据库服务(如Amazon RDS、Google Cloud SQL和Azure SQL Database)实现高效的数据管理。通过示例和最佳实践,展示SQL在云端的应用、性能优化、安全性及成本效益,助力企业提升竞争力。
30 0
|
11天前
|
SQL 关系型数据库 MySQL
SQL Server、MySQL、PostgreSQL:主流数据库SQL语法异同比较——深入探讨数据类型、分页查询、表创建与数据插入、函数和索引等关键语法差异,为跨数据库开发提供实用指导
【8月更文挑战第31天】SQL Server、MySQL和PostgreSQL是当今最流行的关系型数据库管理系统,均使用SQL作为查询语言,但在语法和功能实现上存在差异。本文将比较它们在数据类型、分页查询、创建和插入数据以及函数和索引等方面的异同,帮助开发者更好地理解和使用这些数据库。尽管它们共用SQL语言,但每个系统都有独特的语法规则,了解这些差异有助于提升开发效率和项目成功率。
70 0
|
21天前
|
SQL 关系型数据库 MySQL
【揭秘】MySQL binlog日志与GTID:如何让数据库备份恢复变得轻松简单?
【8月更文挑战第22天】MySQL的binlog日志记录数据变更,用于恢复、复制和点恢复;GTID为每笔事务分配唯一ID,简化复制和恢复流程。开启binlog和GTID后,可通过`mysqldump`进行逻辑备份,包含binlog位置信息,或用`xtrabackup`做物理备份。恢复时,使用`mysql`命令执行备份文件,或通过`innobackupex`恢复物理备份。GTID模式下的主从复制配置更简便。
91 2

热门文章

最新文章