如何优化数据库对象

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

目录
相关文章
|
16天前
|
存储 关系型数据库 MySQL
轻松入门MySQL:数据库设计之范式规范,优化企业管理系统效率(21)
轻松入门MySQL:数据库设计之范式规范,优化企业管理系统效率(21)
|
29天前
|
SQL 缓存 PHP
PHP技术探究:优化数据库查询效率的实用方法
本文将深入探讨PHP中优化数据库查询效率的实用方法,包括索引优化、SQL语句优化以及缓存机制的应用。通过合理的优化策略和技巧,可以显著提升系统性能,提高用户体验,是PHP开发者不容忽视的重要议题。
|
1月前
|
SQL 存储 JSON
阿里云数据库 SelectDB 内核 Apache Doris 2.1.0 版本发布:开箱盲测性能大幅优化,复杂查询性能提升 100%
亲爱的社区小伙伴们,Apache Doris 2.1.0 版本已于 2024 年 3 月 8 日正式发布,新版本开箱盲测性能大幅优化,在复杂查询性能方面提升100%,新增Arrow Flight接口加速数据读取千倍,支持半结构化数据类型与分析函数。异步多表物化视图优化查询并助力仓库分层建模。引入自增列、自动分区等存储优化,提升实时写入效率。Workload Group 资源隔离强化及运行时监控功能升级,保障多负载场景下的稳定性。新版本已经上线,欢迎大家下载使用!
阿里云数据库 SelectDB 内核 Apache Doris 2.1.0 版本发布:开箱盲测性能大幅优化,复杂查询性能提升 100%
|
1月前
|
存储 搜索推荐 关系型数据库
深度探讨数据库索引的数据结构及优化策略
深度探讨数据库索引的数据结构及优化策略
|
1月前
|
存储 关系型数据库 MySQL
最全MySQL面试60题(含答案):存储引擎+数据库锁+索引+SQL优化等
最全MySQL面试60题(含答案):存储引擎+数据库锁+索引+SQL优化等
162 0
|
16天前
|
存储 关系型数据库 MySQL
MySQL数据库性能大揭秘:表设计优化的高效策略(优化数据类型、增加冗余字段、拆分表以及使用非空约束)
MySQL数据库性能大揭秘:表设计优化的高效策略(优化数据类型、增加冗余字段、拆分表以及使用非空约束)
|
3天前
|
SQL 缓存 Java
Java数据库连接池:优化数据库访问性能
【4月更文挑战第16天】本文探讨了Java数据库连接池的重要性和优势,它能减少延迟、提高效率并增强系统的可伸缩性和稳定性。通过选择如Apache DBCP、C3P0或HikariCP等连接池技术,并进行正确配置和集成,开发者可以优化数据库访问性能。此外,批处理、缓存、索引优化和SQL调整也是提升性能的有效手段。掌握数据库连接池的使用是优化Java企业级应用的关键。
|
4天前
|
SQL 关系型数据库 数据库
【后端面经】【数据库与MySQL】SQL优化:如何发现SQL中的问题?
【4月更文挑战第12天】数据库优化涉及硬件升级、操作系统调整、服务器/引擎优化和SQL优化。SQL优化目标是减少磁盘IO和内存/CPU消耗。`EXPLAIN`命令用于检查SQL执行计划,关注`type`、`possible_keys`、`key`、`rows`和`filtered`字段。设计索引时考虑外键、频繁出现在`where`、`order by`和关联查询中的列,以及区分度高的列。大数据表改结构需谨慎,可能需要停机、低峰期变更或新建表。面试中应准备SQL优化案例,如覆盖索引、优化`order by`、`count`和索引提示。优化分页查询时避免大偏移量,可利用上一批的最大ID进行限制。
32 3
|
16天前
|
缓存 监控 数据库
优化数据库查询性能的八大技巧
在今天的互联网时代,数据库是许多应用程序的核心组件之一。优化数据库查询性能是提升应用程序整体性能的关键。本文介绍了八种有效的技巧,帮助开发人员提高数据库查询性能,从而提升应用程序的响应速度和用户体验。
|
1月前
|
SQL 数据库 OceanBase
OceanBase数据库的回收站功能是为了短暂保存被删除的数据库对象
【2月更文挑战第21天】OceanBase数据库的回收站功能是为了短暂保存被删除的数据库对象
18 7