如何优化数据库对象

简介: MySQL的每一个操作几乎离不开数据表,对数据库对象的优化大到整张表,小到一个字符型,都可能对数据库性能起到出乎意外的惊喜。
优化表的数据类型
    应用设计的时候需要考虑字段长度留有一定冗余,但是不能留有大量的冗余。这样浪费磁盘存储空间,同时在应用程序操作时也浪费物理内存。
    数据类型 通常 更小的更好。一般应该尽可能使用能正确存储数据的最小数据类型,更小的数据类型通常更快,因为他们占用更少的磁盘、内存和CPU缓存,并且处理需要的CPU周期更少。
     整型比字符串操作代价更低,一般整型>字符串>时间

    在MySQL中 可以使用函数PROCEDURE ANALYSE()对当前应用的表进行分析
    语法 select * from tb1_name procedure analyse();
        输出的每一列信息都会对数据表中的列的数据类型提出优化建议
    select * from tb1_name procedure analyse(16,256);
        不要为那些包含的值多余16个或者256个字节的ENUM类型提出建议 
        如果没有这样的限制 输出信息可能很长 ENUM定义通产很难阅读

通过拆分提高表的访问效率
    MyISAM类型的表拆分
        1 垂直拆分 按照不同的表(或者Schema)来切分到不同的数据库(主机)之上,这种切可以称之为数据的垂直(纵向)切分,即把主码和一些列放到一个表 然后把主码和另外的列放到另一个表中。
            适用情况:一个表中的某些列常用,而另一些列不常用,则可以采用垂直拆分 
            优点:垂直拆分可以使得数据行变小,一个数据页就能存放更多的数据,减少I/O次数。这样使得数据模块更清楚,数据维护起来更方便。
            缺点:需要管理冗余列,查询所有数据需要联合操作,有些查询无法再数据库层面解决,如果依然有大表造成的性能问题,解决不了。并且切分到一定程度的话,扩展性就会遇到限制。过度切分可能会带来系统过渡复杂而难以维护。
        2 水平拆分 将某个访问极其频繁的表再根据一列或多列数据的某种规则来分散到多个独立表之中,每个表中包含一部分数据。
            适用情况:
                1 表很大 分割后可以降低在查询时需要读的数据和索引的页数 同时也降低了索引的层数提高查询速度
                2 表中的数据本来就有独立性
                3 需要把数据存放到多个介质上

逆规范化
    数据库规范化越高 产生的关系越多 关系过多的直接结果就是导致表之间的连接操作越繁琐 而表之间的连接操作室性能较低的操作 直接影响到查询的速度 所以 对于查询较多的应用 就需要根据实际情况运用逆规范化对数据进行设计 通过逆规范化来提高查询的性能
    反规范的好处是降低连接操作的需求降低外码和索引的数据 还可能减少表的数目 相应带来的问题是可能出现数据的完整性问题 加速查询速度 但会降低修改速度
    使用反规范要仔细分析应用的数据存取需求和实际的性能特点 能用索引和其他方法解决问题就不使用反规范
    常用反规范方法
        1 增加荣誉列 在表中具有相同列 他常用来在查询时避免连接操作
        2 增加派生列 增加的列来自其他表中的数据 由其他表中的数据经过计算生成 增加的派生列 其作用是在查询时减少连接操作 避免使用集函数
        3 重新组表  如果许多用户需要查看两个表连接出来的结果数据 则把这两个表重新组成一个表来减少连接而提高性能
        4 分割表 水平分割和垂直分割
    管理和维护数据的完整性的常用方法
        1 批处理维护是指对复制列或派生列的修改积累一定时间后运行一批处理作业或存储过程对复制或派生列进行修改 这只能在对实时性要求不高的情况下使用
        2 数据的完整性也可由应用逻辑来实现 这就要求必须在同一事物中对所有涉及的表进行增删改操作 而应用逻辑来实现数据的完整性分先较大 因为统一逻辑必须在所有的应用中使用和维护 容易遗漏特别是在需求变化时 不易于维护
        3 触发器 对数据的任何修改立即触发对复制列或派生列的相应修改 触发器是实时的 而相应的处理逻辑只在一个地方出现 易于维护 一般来说 是解决此类问题比较好的办法

使用中间表提高查询速度
    场景 在数据量较大的表 在其上进行查询通常会效率很低 并且还要考虑统计查询是否会对在线的应用产生负面影响 
    优点
        1 中间表复制源表部分数据 并且与源表相隔离 在中间表上做统计查询不会对在线应用产生负面影响
        2 中间表上可以灵活地添加索引或者增加临时用的新字段 从而达到提高统计查询效率和辅助统计查询作用

目录
相关文章
|
6天前
|
SQL 关系型数据库 分布式数据库
PolarDB Proxy配置与优化:提升数据库访问效率
【9月更文挑战第6天】PolarDB是阿里云推出的高性能分布式关系型数据库,PolarDB Proxy作为其关键组件,位于客户端与PolarDB集群间,负责SQL请求的解析与转发,并支持连接池管理、SQL过滤及路由规则等功能。本文详细介绍了PolarDB Proxy的配置方法,包括连接池、负载均衡和SQL过滤设置,并探讨了监控调优、缓存及网络优化策略,以帮助提升数据库访问效率。
16 1
|
6天前
|
存储 关系型数据库 MySQL
如何优化数据库查询?
如何优化数据库查询?
20 1
|
18天前
|
存储 缓存 负载均衡
【PolarDB-X 技术揭秘】Lizard B+tree:揭秘分布式数据库索引优化的终极奥秘!
【8月更文挑战第25天】PolarDB-X是阿里云的一款分布式数据库产品,其核心组件Lizard B+tree针对分布式环境优化,解决了传统B+tree面临的数据分片与跨节点查询等问题。Lizard B+tree通过一致性哈希实现数据分片,确保分布式一致性;智能分区实现了负载均衡;高效的搜索算法与缓存机制降低了查询延迟;副本机制确保了系统的高可用性。此外,PolarDB-X通过自适应分支因子、缓存优化、异步写入、数据压缩和智能分片等策略进一步提升了Lizard B+tree的性能,使其能够在分布式环境下提供高性能的索引服务。这些优化不仅提高了查询速度,还确保了系统的稳定性和可靠性。
44 5
|
15天前
|
缓存 NoSQL 数据库
Web服务器与数据库优化:提升系统性能的最佳实践
【8月更文第28天】在现代的Web应用中,Web服务器与后端数据库之间的交互是至关重要的部分。优化这些组件及其相互作用可以显著提高系统的响应速度、吞吐量和可扩展性。本文将探讨几种常见的优化策略,并提供一些具体的代码示例。
31 1
|
20天前
|
监控 数据库 索引
如何优化数据库索引?
【8月更文挑战第23天】如何优化数据库索引?
34 4
|
18天前
|
SQL 缓存 监控
优化大型数据库查询的最佳实践
在处理大规模数据时,数据库查询性能的优化至关重要。本文探讨了几种优化大型数据库查询的最佳实践,包括索引策略、查询重写、数据分区和缓存机制。通过这些方法,开发人员可以显著提高查询效率,减少系统负担,提升用户体验。本文还结合实际案例,提供了具体的优化技巧和工具建议,帮助读者有效地管理和优化大型数据库系统。
|
11天前
|
C# UED 定位技术
WPF控件大全:初学者必读,掌握控件使用技巧,让你的应用程序更上一层楼!
【8月更文挑战第31天】在WPF应用程序开发中,控件是实现用户界面交互的关键元素。WPF提供了丰富的控件库,包括基础控件(如`Button`、`TextBox`)、布局控件(如`StackPanel`、`Grid`)、数据绑定控件(如`ListBox`、`DataGrid`)等。本文将介绍这些控件的基本分类及使用技巧,并通过示例代码展示如何在项目中应用。合理选择控件并利用布局控件和数据绑定功能,可以提升用户体验和程序性能。
26 0
|
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
|
12天前
|
SQL 关系型数据库 MySQL
SQL性能调优的神奇之处:如何用优化技巧让你的数据库查询飞起来,实现秒级响应?
【8月更文挑战第31天】在现代软件开发中,数据库性能至关重要。本文通过一个实战案例,展示了从慢查询到秒级响应的全过程。通过对查询的详细分析与优化,包括创建索引、改进查询语句及数据类型选择等措施,最终显著提升了性能。文章还提供了示例代码及最佳实践建议,帮助读者掌握SQL性能调优的核心技巧。
28 0