19.优化数据库对象
19.1 优化表的数据类型
应用设计时需要考虑字段的类型和长度,并留有一定长度冗余。
procedure analyse()函数可以对表中列的数据类型提出优化建议。
procedure analyse()函数用法:
select * from 表名 procedure analyse(); -- 对所有列提出优化建议
select * from 表名 procedure analyse(16,256); -- 不对包含16至256取值的枚举列提出建议
分析的结果是针对每个列,输出该列的最小值、最大值、最小值长度、最大值长度、空字符串或0的个数、null的个数、平均值、方差、优化建议。
注意:该函数只对已存在的表,且包含大量记录时分析有效,这样的表对类型修改时一定要注意DDL锁表的问题。
该函数不能在设计阶段给出类型和长度建议。

19.2 通过拆分提高表的访问效率
对表拆分分为:垂直拆分和水平拆分。
垂直拆分指将主键和常用列放在一张表中(主表),将主键和非常用列放在另一张表中(从表)。
如果从表中除主键列意外所有列都是无效取值(空字符串、null、0),则不需要保存该行信息,所以从表的记录量比主表少,从而优化存储空间。
在查询时如果只从主表查找,则优化查询速度;如果要从主表和从表连接查找,则产生了left join。
并且拆表后主键同时存储在两张表中,增加的冗余,即增加了程序对冗余的管理和事务的管理。
水平拆分指根据一个列或多个列的数据值将数据存放到两个同构且独立的表中。
水平拆分适用场景:表很大,表中数据有独立性,需要把数据存放在多个介质上。
如果查询与分表的依据一致,则只需要在一个分表中执行,优化了速度。
如果查询与分表的依据不一致,则只需要在多个分表中执行并将结果union all在一起,增加了业务复杂度。
水平拆分需要考虑数据量的增长速度。

19.3 逆规范化
规范化保证数据的一致性、完整性,避免数据的冗余,不一致等。
规范化带来的问题是查询时可能产生多表关联,影响查询速度。
逆规范化指通过增加冗余列、派生列或重组表、分割表来提升查询速度,但需要应用程序来保证数据的一致性和完整性。
冗余列:指在多个表中具有相同的列,常用来避免连接查询。例如:给emp表增加dname列,则dname同时存在于emp表和dept表。
派生列:指该列可由其它列计算生成,常用来避免在查询中实时计算。例如:年龄=当前日期-出生日期,年薪=月薪*12。
重组表:指将用户需要查看的多个表连接的结果构造成一张表,常用来避免连接查询,缺点需要实时或定时从查询的多张表向该表同步数据。
分割表:指垂直分割和水平分割。
规范化带来的问题是数据的一致性、完整性不能保证,维护的方法分为:批处理存储过程实现、应用逻辑实现、触发器实现。
批处理存储过程实现:是指定期调用存储过程来更新冗余列、派生列、重组表、拆分表等信息。缺点:实时性不高。
应用逻辑实现:指应用程序在同一个事务内完成本业务和冗余列、派生列、重组表、拆分表的DML操作。缺点:业务逻辑复杂、开发难度大、容易遗漏、数据完整性风险大。
触发器实现:对数据的DML操作立即出发对冗余列、派生列、重组表、拆分表的DML操作,业务逻辑扩展简单、实时性高。缺点:数据库维护难度大,项目数据库迁移难度大。

19.4 使用中间表提高统计查询速度
指先复制业务表及其数据,然后在复制的表(中间表)上进行统计操作。
优点:不影响业务。
缺点:增加存储空间,有一个表和数据的复制过程。

19.5 小结
数据库设计是应用程序的基础,前期设计的好坏影响应用程序的整个生命周期及数据质量。
越到后期的数据库设计调整,对业务影响越大。

19.Mysql优化数据库对象的更多相关文章

  1. (1.13)mysql优化数据库对象

    (1.13)mysql优化数据库对象 1.mysql优化数据库对象 [1.1]数据库对象类型优化 select * from test1 procedure analyse(); ,); --不要为那 ...

  2. MySQL 优化数据库对象

    一.考虑是用 procedure analyse() 函数对当前应用的表进行分析.字段类型是否可优化. 二.通过拆分提高表的访问效率. (A) 针对MyISAM表,有两种拆分方法: 垂直拆分:主码和某 ...

  3. MySQL优化篇(一),我可以和面试官多聊几句吗?——SQL优化流程与优化数据库对象

    我可以和面试官多聊几句吗?只是想偷点技能过来.MySQL优化篇(基于MySQL8.0测试验证),上部分:优化SQL语句.数据库对象,MyISAM表锁和InnoDB锁问题. MyISAM表锁和InnoD ...

  4. MySQL优化(三):优化数据库对象

    二.优化数据库对象 1.优化表的数据类型 应用设计的时候需要考虑字段的长度留有一定的冗余,但不推荐很多字段都留有大量的冗余,这样既浪费磁盘空间,也在应用操作时浪费物理内存. 在MySQL中,可以使用函 ...

  5. mysql优化-数据库设计基本原则

    mysql优化-数据库设计基本原则 一.数据库设计三范式 第一范式:字段具有原子性 原子性是指数据库的所有字段都不可被再次划分,如下表就不满足原子性,起点与终点 字段就可被拆分为起点与终点两个字段. ...

  6. (5)MySQL进阶篇SQL优化(优化数据库对象)

    1.概述 在数据库设计过程中,用户可能会经常遇到这种问题:是否应该把所有表都按照第三范式来设计?表里面的字段到底改设置为多大长度合适?这些问题虽然很小,但是如果设计不当则可能会给将来的应用带来很多的性 ...

  7. mysql优化-数据库优化、SQL优化

    我有一张表w1000,里面有1000万条数据,这张表结构如下:CREATE TABLE `w1000` ( `id` varchar(36) NOT NULL, `name` varchar(10) ...

  8. MySQL定义数据库对象之指定definer

    mysql创建view.trigger.function.procedure.event时都会定义一个Definer: SQL SECURITY 有两个选项,一个为DEFINER,一个为INVOKER ...

  9. [数据库系列之MySQL]Mysql优化笔记

    大型网站提速之MySql优化 数据库优化包括的方面 数据库优化是一个综合性的技术,并不是通过某一种方式让数据库效率提高很多,而是通过多方面的提高,从而使得数据库提高很多. 主要包括: 1.表的设计合理 ...

随机推荐

  1. JQUERY 简单易用的提示框插件

    业务开发过程中,为了避免用户的误操作,提示框是必要的,于是琢磨出了下面这个使用,方便的提示框 还要引入遮罩层的样式如下: /*弹出层*/.input{height: 32px;border: 1px ...

  2. CSS强制换行和禁止换行代码

    一.强制换行      1.word-break: break-all;       只对英文起作用,以字母作为换行依据.      2.word-wrap: break-word;   只对英文起作 ...

  3. Swift字符串常用方法

    1.0 比较两个字符串是否相等 判断字符串相等的方法是: ==. var str1 = "Hello world" var str2 = "Hello world&quo ...

  4. 利用等概率Rand5产生等概率Rand3(转)

    问题本身很明确,但不知道起个什么题目好,姑且先这么说吧. 问题描述:现在有一个叫做Rand5的函数,可以生成等概率的[0, 5)范围内的随机整数,要求利用此函数写一个Rand3函数(除此之外,不能再使 ...

  5. 环境变量之path的一点理解

    最初安装java环境时一直不明白为什么要配置环境变量,百度了一下还是理解不透彻. 后来安装python时也要配置环境变量.. 在经过未配置和配置的操作后,才有些理解path的含义. 1.未配置环境变量 ...

  6. ajax-》post

    1:最近写完前端,又写后端,jQuery的ajax已经用烂了,事实证明的确好用,再分享一下. data是后台echo的值,可以是数字,也可以是数组,用json_encode()包裹数组形式,前端接收要 ...

  7. 过滤access日志前5条数据

    cat /usr/local/nginx/logs/access.log|awk '{print $1}'|sort|uniq -c|sort -n -r|head -5 找不到的话可以find查找a ...

  8. 1.5.2、CDH 搭建Hadoop在安装之前(定制安装解决方案---使用内部包存储库)

    本主题描述如何在Cloudera Manager部署中创建内部包存储库和直接主机以使用该存储库.您可以创建永久或临时存储库. 完成这些步骤后,您可以安装特定版本的Cloudera Manager或在未 ...

  9. The number of method references in a .dex file cannot exceed 64K.(转)

    前言 我一直都知道app里面的方法数是有限制的差不多64000,具体的就未曾考证了在遇到这个问题之前,一直以为这个一个多么遥远的距离其实并不是的,稍有不慎这个异常出来了当前并不是你真的有编写了64k的 ...

  10. racktables 后期维护

    一.网站与数据库分离 vim secret.php #$pdo_dsn = 'mysql:host=localhost;dbname=racktables'; #$db_username = 'roo ...