数据库的约束规则与语义优化

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 数据库的约束规则与语义优化 数据完整性:是指数据的精确性和可靠性。 作用: 1.防止用户向数据库中添加不合语义的数据 2.利用基于DBMS的完整性控制机制来实现业务规则,易于定义,容易理解,而且可以降低应用程序的复杂性,提高应用程序的运行效率,同时,基于DBMS的完整性控制机制是集中管理的,因此比应用程序更容易实现数据库的完整性。

数据库的约束规则与语义优化

数据完整性:是指数据的精确性和可靠性。
作用:
1.防止用户向数据库中添加不合语义的数据
2.利用基于DBMS的完整性控制机制来实现业务规则,易于定义,容易理解,而且可以降低应用程序的复杂性,提高应用程序的运行效率,同时,基于DBMS的完整性控制机制是集中管理的,因此比应用程序更容易实现数据库的完整性。
数据完整性分为四类:
1.实体完整性:唯一性---主键
2.域完整性:保证数据库字段取值的合理性。包括检查(CHECK),默认值(DEFAULT),不为空,可为空
3.参照完整性:主外键
4.用户自定义完整性
语义优化是从语义的角度对SQL进行优化,不是一种形式上的优化,所以其优化的范围,可能覆盖其他类型的优化范围。
语义转换:因为完整性限制等的原因使得一个转换成立的情况成为语义。
语义优化:因为语义转换形成的优化称为语义优化。
语义转换其实是根据完整性约束等信息对“某特定语义”进行推理,进而得到的一种查询效率不同但结果相同的查询。
语义优化常见的方式:
1.连接消除:例如A、B两个基表做自然连接,创建一个视图V,如果在视图V上执行查询只涉计其中一个基表的信息,则对视图的查询完全可以转化为对某个基表的查询。
2.连接引入:增加连接有助于原始关系变小或原关系的选择率降低。
3.谓词引入:根据完整性约束等信息,引入新谓词,如引入基于索引的列,可能是查询更快。
例如:一个表上,有“c1<c2”的列约束,c2列上存在一个索引,查询语句中的WHERE条件有“c1>200”,则可以推知“c2>200”,WHER条件变更为“c1>200 AND c2>200 AND c1<c2”
4.检测空回答集:查询语句中的谓词与约束相勃,可以推知条件结果为false,也许最终的结果集能为空。
例如:CHECK约束限定“score”列的范围是60到100,而一个查询条件是“score<60”,则能立刻推知条件不成立
5.排序优化:ORDERBY操作通常由索引或排序完成,如果能够利用索引,则排序操作可省略。
6.唯一性使用:利用唯一性、索引等特点,检查是否存在不必要的DISTINCT操作。

示例1:语义优化中的检测空回答集技术,MYSQL支持:


AI 代码解读
create table student(name VARCHAR(30) not null,age int);
insert into student values('tom',19);
insert into student values('marray',19);
insert into student values('jack',19);
mysql> explain EXTENDED SELECT * FROM student WHERE name IS NULL AND age>18;
+----+-------------+-------+------+------+---------+------+------+----------+------------------+
| id | select_type | table | type | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------+------+---------+------+------+----------+------------------+
| 1 | SIMPLE | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Impossible WHERE |
+----+-------------+-------+------+------+---------+------+------+----------+-----------

示例2:语义优化中的谓词引入技术,MYSQL不支持
创建表如下,列c2有唯一索引存在,并创建CHECK约束:
CREATE TABLE C (c1 INT, c2 INT UNIQUE, CHECK(c1<c2));

在c1列上进行条件查询,查询执行计划:


AI 代码解读
mysql> EXPLAIN EXTENDED SELECT * FROM C WHERE c1>60;
+----+-------------+-------+------+------+---------+------+------+-------------+
| id | select_type | table | type | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+------+---------+------+------+-------------+
| 1 | SIMPLE | C | ALL | NULL | NULL | NULL | 1 | Using where |
+----+-------------+-------+------+------+---------+------+------+-------------+

示例3:语义优化中的排序优化,mysql支持,但条件较为苛刻。
创建表如下:
CREATE TABLE D (d1 INT, d2 INT UNIQUE);
对D进行自连接,连接条件使用有唯一索引的列,且连接条件的列与排序列相同。

查询执行计划:


AI 代码解读
mysql> EXPLAIN EXTENDED SELECT * FROM D F1, D F2 WHERE F1.d2=F2.d2 ORDER BY F1.d2;
+----+-------------+-------+------+------+-----------+-----------------------------+
| id | select_type | table | type | key | ref | Extra |
+----+-------------+-------+------+------+-----------+-----------------------------+
| 1 | SIMPLE | F1 | ALL | NULL | NULL | Using where; Using filesort |
| 1 | SIMPLE | F2 | ref | d2 | tt2.F1.d2 | NULL |
+----+-------------+-------+------+------+-----------+-----------------------------+

示例4:语义优化中的唯一性使用,MySQL支持


AI 代码解读
create table e(e1 int,e2 int UNIQUE,e3 int,PRIMARY key(e1))
insert into e values(1,1,1);
insert into e values(2,null,null);
insert into e values(3,3,3);
insert into e values(4,null,null);
insert into e values(5,5,5);
mysql> EXPLAIN EXTENDED SELECT DISTINCT e1 FROM E;
+----+-------------+-------+-------+------+---------+------+------+----------+-------------+
| id | select_type | table | type | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+-------+------+---------+------+------+----------+-------------+
| 1 | SIMPLE | E | index | e2 | 5 | NULL | 5 | 100.00 | Using index |
+----+-------------+-------+-------+------+---------+------+------+----------+-------------+
mysql> EXPLAIN EXTENDED SELECT DISTINCT e2 FROM E;
+----+-------------+-------+-------+------+---------+------+------+----------+-------------+
| id | select_type | table | type | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+-------+------+---------+------+------+----------+-------------+
| 1 | SIMPLE | E | index | e2 | 5 | NULL | 5 | 100.00 | Using index |
+----+-------------+-------+-------+------+---------+------+------+----------+-------------+
mysql> EXPLAIN EXTENDED SELECT DISTINCT e3 FROM E;
+----+-------------+-------+------+------+-----------------+
| id | select_type | table | type | key | Extra |
+----+-------------+-------+------+------+-----------------+
| 1 | SIMPLE | E | ALL | NULL | Using temporary |
+----+-------------+-------+------+------+-----------------+

示例5:语义优化中的连接消除技术MySQL不支持


AI 代码解读
create table a(a1 int,a2 int);
create table b(b1 int,b2 int);
create view v as select * from a,b;
insert into a values(1,1);
insert into a values(2,2);
insert into a values(3,3);
mysql> EXPLAIN SELECT a1, a2 FROM V WHERE a1>2;
+----+-------------+-------+------+----------------------------------------------------+
| id | select_type | table | type | Extra |
+----+-------------+-------+------+----------------------------------------------------+
| 1 | SIMPLE | b | ALL | NULL |
| 1 | SIMPLE | a | ALL | Using where; Using join buffer (Block Nested Loop) |
+----+-------------+-------+------+----------------------------------------------------+

 

原文地址 https://blog.csdn.net/qq_36594703/article/details/81269676
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
58
分享
相关文章
如何优化SQL查询以提高数据库性能?
这篇文章以生动的比喻介绍了优化SQL查询的重要性及方法。它首先将未优化的SQL查询比作在自助餐厅贪多嚼不烂的行为,强调了只获取必要数据的必要性。接着,文章详细讲解了四种优化策略:**精简选择**(避免使用`SELECT *`)、**专业筛选**(利用`WHERE`缩小范围)、**高效联接**(索引和限制数据量)以及**使用索引**(加速搜索)。此外,还探讨了如何避免N+1查询问题、使用分页限制结果、理解执行计划以及定期维护数据库健康。通过这些技巧,可以显著提升数据库性能,让查询更高效流畅。
云数据库实战:基于阿里云RDS的Python应用开发与优化
在互联网时代,数据驱动的应用已成为企业竞争力的核心。阿里云RDS为开发者提供稳定高效的数据库托管服务,支持多种数据库引擎,具备自动化管理、高可用性和弹性扩展等优势。本文通过Python应用案例,从零开始搭建基于阿里云RDS的数据库应用,详细演示连接、CRUD操作及性能优化与安全管理实践,帮助读者快速上手并提升应用性能。
Vue.js应用结合Redis数据库:实践与优化
将Vue.js应用与Redis结合,可以实现高效的数据管理和快速响应的用户体验。通过合理的实践步骤和优化策略,可以充分发挥两者的优势,提高应用的性能和可靠性。希望本文能为您在实际开发中提供有价值的参考。
79 11
使用访问指导(SQL Access Advisor)优化数据库业务负载
本文介绍了Oracle的SQL访问指导(SQL Access Advisor)的应用场景及其使用方法。访问指导通过分析给定的工作负载,提供索引、物化视图和分区等方面的优化建议,帮助DBA提升数据库性能。具体步骤包括创建访问指导任务、创建工作负载、连接工作负载至访问指导、设置任务参数、运行访问指导、查看和应用优化建议。访问指导不仅针对单条SQL语句,还能综合考虑多条SQL语句的优化效果,为DBA提供全面的决策支持。
118 11
【深入了解MySQL】优化查询性能与数据库设计的深度总结
本文详细介绍了MySQL查询优化和数据库设计技巧,涵盖基础优化、高级技巧及性能监控。
668 0
gbase 8a 数据库 SQL合并类优化——不同数据统计周期合并为一条SQL语句
gbase 8a 数据库 SQL合并类优化——不同数据统计周期合并为一条SQL语句
gbase 8a 数据库 SQL优化案例-关联顺序优化
gbase 8a 数据库 SQL优化案例-关联顺序优化
微服务架构下的数据库设计与优化策略####
本文深入探讨了在微服务架构下,如何进行高效的数据库设计与优化,以确保系统的可扩展性、低延迟与高并发处理能力。不同于传统单一数据库模式,微服务架构要求更细粒度的服务划分,这对数据库设计提出了新的挑战。本文将从数据库分片、复制、事务管理及性能调优等方面阐述最佳实践,旨在为开发者提供一套系统性的解决方案框架。 ####
深入浅出后端开发之数据库优化实战
【10月更文挑战第35天】在软件开发的世界里,数据库性能直接关系到应用的响应速度和用户体验。本文将带你了解如何通过合理的索引设计、查询优化以及恰当的数据存储策略来提升数据库性能。我们将一起探索这些技巧背后的原理,并通过实际案例感受优化带来的显著效果。
92 4
如何进行数据库连接池的参数优化?
数据库连接池参数优化包括:1) 确定合适的初始连接数,考虑数据库规模和应用需求;2) 调整最大连接数,依据并发量和资源状况;3) 设置最小空闲连接数,平衡资源利用和响应速度;4) 优化连接超时时间,确保系统响应和资源利用合理;5) 配置连接有效性检测,定期检查连接状态;6) 调整空闲连接回收时间,适应访问模式并配合数据库超时设置。

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等