优化数据库对象

优化表的数据类型:

可通过PROCEDURE_ANALYZE()对当前应用的表进行分析,语法:

SELECT * FROM tb_name PROCEDURE ANALYSE()

范例:

-- 建表

mysql> CREATE TABLE DUCK_CUST(

-> cust_num MEDIUMINT AUTO_INCREMENT,

-> cust_title TINYINT,

-> cust_last CHAR(20) NOT NULL,

-> cust_first CHAR(15) NOT NULL,

-> cust_suffix ENUM('Jr.', 'II', 'III', 'IV', 'V', 'M.D.', 'PhD'),

-> cust_add1 CHAR(30) NOT NULL,

-> cust_add2 CHAR(10),

-> cust_city CHAR(18) NOT NULL,

-> cust_state CHAR(2) NOT NULL,

-> cust_zip1 CHAR(5) NOT NULL,

-> cust_zip2 CHAR(4),

-> cust_duckname CHAR(25) NOT NULL,

-> cust_duckday DATE,

-> PRIMARY KEY (cust_num)

)ENGINE=MyISAM;

#插入数据

...

#查看表优化

mysql> SELECT * FROM DUCK_CUST PROCEDURE ANALYSE()\G

*************************** 1. row ***************************

Field_name: test.DUCK_CUST.cust_num

Min_value: 1

Max_value: 1

Min_length: 1

Max_length: 1

Empties_or_zeros: 0

Nulls: 0

Avg_value_or_avg_length: 1.0000

Std: 0.0000

Optimal_fieldtype: ENUM('1') NOT NULL

*************************** 2. row ***************************

Field_name: test.DUCK_CUST.cust_title

Min_value: 1

Max_value: 1

Min_length: 1

Max_length: 1

...

可见由于cust_num数据Max_length, Min_length, Avg_value_or_avg_length, 长度均为1,所以建议用MEDIUMINT(2)

通过拆分提高表的访问效率:

这里的拆分指数据库表进行拆分,对于MyISAM表主要有两种拆分方法:

1. 第一种方法是垂直拆分,即把主键和一些列放到一个表,然后把主键和其他一些列放到另一个表中。这样可以把常用列和非常用列分开,一定程度上减少I/O次数,但需要管理冗余列,查询所有数据需要JOIN操作。

2. 第二种方法是水平拆分,根据一列或多列的值,把数据行放到两个独立的表中。表很大,分割后可以降低在查询时所需要读的数据和索引的页数;表中数据本来就有独立性,比如有些数据常用,有些不常用。需要把数据存放在多个介质中。

逆规范化:

大学老师都喜欢讲究三范式,道理不错,要放在数据量大,查询频繁的互联网应用中,是完全行不通的,我们随时需要逆规范化。

常用的逆规范化技术有:

1. 增加冗余列:指多个表中具有相同的列,避免连接查询。

2. 增加派生列:指增加的列来自其他表中的数据,由其他表中的数据经过计算生成,以减少连接查询和集函数的使用。

3. 重新组表:指如果许多用户需要查询两个表的数据,则把他们组合成一张表,以减少连接查询。

4. 分割表:把常用列与非常用列等可以分开保存,减少查询的I/O。

逆规范也会带来一定的问题,比如数据完整性等,你需要保证各表的各种冗余字段的同步,个人建议冗余那些不会或不经常变动的列,可以通过其他一些方法保证数据完整性:

1. 定时批处理更新。

2. 在逻辑实现中实现同步。

3. 触发器同步执行。

使用中间表提高统计查询速度:

对数据量较大的表,我们可以采用中间表来进行查询,以提高查询性能。

范例:

# 建表

mysql> CREATE TABLE session(

-> cust_id VARCHAR(10),

-> cust_amount DECIMAL(16,2),

-> cust_date DATE,

-> cust_ip VARCHAR(20));

Query OK, 0 rows affected (0.36 sec)

# 插入大量数据后

...

# 查询特定用户的消费总金额

mysql> SELECT sum(cust_amount) FROM session WHERE cust_id='123';

+------------------+

| sum(cust_amount) |

+------------------+

| 25585254.40 |

+------------------+

1 row in set (5.81 sec)

# 若先将记录转移到中间表

mysql> CREATE TABLE tmp_session(

-> cust_id VARCHAR(10),

-> cust_amount DECIMAL(16, 2),

-> cust_date DATE,

-> cust_ip VARCHAR(20));

Query OK, 0 rows affected (0.72 sec)

#将数据先放到中间表

mysql> INSERT INTO tmp_session SELECT * FROM session WHERE cust_id='123';

Query OK, 2097152 rows affected (21.19 sec)

Records: 2097152 Duplicates: 0 Warnings: 0

mysql> SELECT sum(cust_amount) FROM tmp_session;

+------------------+

| sum(cust_amount) |

+------------------+

| 25585254.40 |

+------------------+

1 row in set (1.76 sec)

中间表在统计查询中经常会用到,主要优点有:

1. 中间表复制源表部分数据,并且与源表相隔离,在中间表上做统计查询不会对在线应用产生负面影响。

2. 中间表上可以灵活的添加索引或增加临时用的新字段,从而达到提高统计查询效率和辅助统计查询作用。

不吝指正。

mysql数据库对象管理_MySQL管理与优化(15):优化数据库对象相关推荐

  1. 【宋红康 MySQL数据库 】【高级篇】【15】数据库其它调优策略

    持续学习&持续更新中- 学习态度:守破离 [宋红康 MySQL数据库 ][高级篇][15]数据库其它调优策略 数据库调优的措施 调优的目标 如何定位调优问题 调优的维度和步骤 优化MySQL服 ...

  2. mysql 重置表索引_MySQL管理表和索引

    MySQL管理表和索引 SQL语句: 数据库 表 索引 视图 DML创建数据库: CREATE DATABASE|SCHEMA [IF NOT EXISTS] db_name [CHARACTER S ...

  3. mysql schema数据混乱_MySQL之Schema与数据类型优化

    选择优化的数据类型 MySQL支持的数据类型非常多,选择正确的数据类型对于获得高性能至关重要.不管存储哪种类型的数据,下面几个简单的原则都有助于做出更好的选择: 更小的通常更好 一般情况下,应该尽量使 ...

  4. mysql数据库的安全机制管理_mysql管理之安全机制

    Mysql权限表>>初始化过后产生的mysql库 Mysql.user表非常重要 一.用户字段 二.权限字段 三.安全字段 四.资源控制字段 Mysql.db  mysql.hsot 用户 ...

  5. mysql商品管理系统总结_Mysql管理总结

    1.phpMyAdmin连接mysql出现错误: 使用phpMyAdmin 连接MySql数据库时出现如下错误: #1251 - Client does not support authenticat ...

  6. mysql考勤系统设计函数_Mysql实战之员工考勤系统数据库建立

    一.项目背景 随着企业的规模不断扩大,企业人事管理的日趋复杂和企业人员的增多,迫切需要开发基于网络的员工考勤管理系统来提高管理工作的效率. 二.研究目的 以中小型企业的考勤管理业务为依托,结合科学管理 ...

  7. mysql 外键效率_MYSQL使用外键进行优化

    #转载请联系 假如你是京东的数据库管理员,你现在管理着这样一个数据库. mysql> select * fromgoods;+----+----------------------------- ...

  8. mysql 双从性能_MySQL双主一致性架构优化

    转自:MySQL双主一致性架构优化 - osc_avwazwuz的个人空间 - OSCHINA​my.oschina.net 一.双主保证高可用 MySQL数据库集群常使用一主多从,主从同步,读写分离 ...

  9. mysql单表瓶颈_mysql单表性能瓶颈_优化系列 | 实例解析MySQL性能瓶颈排查定位-云栖社区-阿里云...

    导读 从一个现场说起,全程解析如何定位性能瓶颈. 排查过程 收到线上某业务后端的MySQL实例负载比较高的告警信息,于是登入服务器检查确认. 1. 首先我们进行OS层面的检查确认 登入服务器后,我们的 ...

最新文章

  1. php打印出来乱码_PHP输出中文乱码的解决方法(转载)
  2. Java指令启动jar
  3. Android移动开发者必须知道的Deep Linking技术
  4. WAVE SUMMIT平行论坛 :产教融合,人才共育
  5. mysql odbc 安装配置过全过程
  6. lua cURL使用笔记
  7. 如何做好一场技术演讲?
  8. 并查集 (Union-Find)算法
  9. 项目中的软件需求说明书的访谈部分
  10. jetson nano 在opencv拉流的视频上显示中文汉字(含c++完整源码)
  11. 剑指Offer之二叉树与双向链表
  12. siki暗黑战神项目总结,框架和主要的优化点
  13. 斐讯k2怎么设置虚拟服务器,设置斐讯K2路由器上网连接教程 | 192路由网
  14. 只有天空才是你的极限,我们热爱探索的过程并沉浸其中丨图数据库 TiMatch 团队访谈
  15. XTU 1148 三角形
  16. vue 批量下载图片并打包成压缩包
  17. golang it营_深入理解Go-垃圾回收机制
  18. 高通7x27a平台UART配置
  19. 双馈风机并网simulink模型
  20. 《机器学习》慕课版课后习题-第5章

热门文章

  1. [转载]提升进程权限-OpenProcessToken等函数的用法
  2. HDU 3651 A Simple Problem
  3. 当head遇上runat=server之后发生的纠结之事
  4. Asp.net(C#)利用File Field多文件上传
  5. CCF201604-1 折点计数(100分)【序列处理】
  6. HDU1871 无题【序列处理】
  7. UVA11577 Letter Frequency【文本】
  8. ACM程序设计基础(1)题解
  9. Project Euler Problem 92 Square digit chains
  10. 理解 static 关键字