如何优化数据库对象

简介: 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 中间表上可以灵活地添加索引或者增加临时用的新字段 从而达到提高统计查询效率和辅助统计查询作用

目录
相关文章
|
4月前
|
关系型数据库 MySQL 数据库连接
Django数据库配置避坑指南:从初始化到生产环境的实战优化
本文介绍了Django数据库配置与初始化实战,涵盖MySQL等主流数据库的配置方法及常见问题处理。内容包括数据库连接设置、驱动安装、配置检查、数据表生成、初始数据导入导出,并提供真实项目部署场景的操作步骤与示例代码,适用于开发、测试及生产环境搭建。
142 1
|
16天前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
208 4
|
3月前
|
机器学习/深度学习 SQL 运维
数据库出问题还靠猜?教你一招用机器学习优化运维,稳得一批!
数据库出问题还靠猜?教你一招用机器学习优化运维,稳得一批!
104 4
|
7月前
|
SQL 关系型数据库 MySQL
如何优化SQL查询以提高数据库性能?
这篇文章以生动的比喻介绍了优化SQL查询的重要性及方法。它首先将未优化的SQL查询比作在自助餐厅贪多嚼不烂的行为,强调了只获取必要数据的必要性。接着,文章详细讲解了四种优化策略:**精简选择**(避免使用`SELECT *`)、**专业筛选**(利用`WHERE`缩小范围)、**高效联接**(索引和限制数据量)以及**使用索引**(加速搜索)。此外,还探讨了如何避免N+1查询问题、使用分页限制结果、理解执行计划以及定期维护数据库健康。通过这些技巧,可以显著提升数据库性能,让查询更高效流畅。
|
7月前
|
存储 SQL 数据库
【赵渝强老师】达梦数据库的数据库对象
达梦数据库包含基本与复杂两大类数据库对象。基本对象如表、索引、视图、序列和同义词,通过单一DDL语句创建和管理。表是数据存储核心,支持多种数据类型;索引提升查询速度,常见类型包括聚集、唯一、函数等索引;视图提供虚表功能;序列生成有序整数;同义词简化对象访问。复杂对象包括存储过程、函数和触发器,需用DMSQL语言开发,适用于更复杂的业务逻辑处理。文中通过实例详细介绍了各类对象的创建与使用方法。
319 3
|
8月前
|
关系型数据库 数据库 数据安全/隐私保护
云数据库实战:基于阿里云RDS的Python应用开发与优化
在互联网时代,数据驱动的应用已成为企业竞争力的核心。阿里云RDS为开发者提供稳定高效的数据库托管服务,支持多种数据库引擎,具备自动化管理、高可用性和弹性扩展等优势。本文通过Python应用案例,从零开始搭建基于阿里云RDS的数据库应用,详细演示连接、CRUD操作及性能优化与安全管理实践,帮助读者快速上手并提升应用性能。
|
9月前
|
缓存 NoSQL JavaScript
Vue.js应用结合Redis数据库:实践与优化
将Vue.js应用与Redis结合,可以实现高效的数据管理和快速响应的用户体验。通过合理的实践步骤和优化策略,可以充分发挥两者的优势,提高应用的性能和可靠性。希望本文能为您在实际开发中提供有价值的参考。
190 11
|
9月前
|
缓存 关系型数据库 MySQL
【深入了解MySQL】优化查询性能与数据库设计的深度总结
本文详细介绍了MySQL查询优化和数据库设计技巧,涵盖基础优化、高级技巧及性能监控。
1487 1
|
10月前
|
SQL Oracle 数据库
使用访问指导(SQL Access Advisor)优化数据库业务负载
本文介绍了Oracle的SQL访问指导(SQL Access Advisor)的应用场景及其使用方法。访问指导通过分析给定的工作负载,提供索引、物化视图和分区等方面的优化建议,帮助DBA提升数据库性能。具体步骤包括创建访问指导任务、创建工作负载、连接工作负载至访问指导、设置任务参数、运行访问指导、查看和应用优化建议。访问指导不仅针对单条SQL语句,还能综合考虑多条SQL语句的优化效果,为DBA提供全面的决策支持。
231 11