mysql数据库对象管理_MySQL管理与优化(15):优化数据库对象
优化数据库对象
优化表的数据类型:
可通过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):优化数据库对象相关推荐
- 【宋红康 MySQL数据库 】【高级篇】【15】数据库其它调优策略
持续学习&持续更新中- 学习态度:守破离 [宋红康 MySQL数据库 ][高级篇][15]数据库其它调优策略 数据库调优的措施 调优的目标 如何定位调优问题 调优的维度和步骤 优化MySQL服 ...
- mysql 重置表索引_MySQL管理表和索引
MySQL管理表和索引 SQL语句: 数据库 表 索引 视图 DML创建数据库: CREATE DATABASE|SCHEMA [IF NOT EXISTS] db_name [CHARACTER S ...
- mysql schema数据混乱_MySQL之Schema与数据类型优化
选择优化的数据类型 MySQL支持的数据类型非常多,选择正确的数据类型对于获得高性能至关重要.不管存储哪种类型的数据,下面几个简单的原则都有助于做出更好的选择: 更小的通常更好 一般情况下,应该尽量使 ...
- mysql数据库的安全机制管理_mysql管理之安全机制
Mysql权限表>>初始化过后产生的mysql库 Mysql.user表非常重要 一.用户字段 二.权限字段 三.安全字段 四.资源控制字段 Mysql.db mysql.hsot 用户 ...
- mysql商品管理系统总结_Mysql管理总结
1.phpMyAdmin连接mysql出现错误: 使用phpMyAdmin 连接MySql数据库时出现如下错误: #1251 - Client does not support authenticat ...
- mysql考勤系统设计函数_Mysql实战之员工考勤系统数据库建立
一.项目背景 随着企业的规模不断扩大,企业人事管理的日趋复杂和企业人员的增多,迫切需要开发基于网络的员工考勤管理系统来提高管理工作的效率. 二.研究目的 以中小型企业的考勤管理业务为依托,结合科学管理 ...
- mysql 外键效率_MYSQL使用外键进行优化
#转载请联系 假如你是京东的数据库管理员,你现在管理着这样一个数据库. mysql> select * fromgoods;+----+----------------------------- ...
- mysql 双从性能_MySQL双主一致性架构优化
转自:MySQL双主一致性架构优化 - osc_avwazwuz的个人空间 - OSCHINAmy.oschina.net 一.双主保证高可用 MySQL数据库集群常使用一主多从,主从同步,读写分离 ...
- mysql单表瓶颈_mysql单表性能瓶颈_优化系列 | 实例解析MySQL性能瓶颈排查定位-云栖社区-阿里云...
导读 从一个现场说起,全程解析如何定位性能瓶颈. 排查过程 收到线上某业务后端的MySQL实例负载比较高的告警信息,于是登入服务器检查确认. 1. 首先我们进行OS层面的检查确认 登入服务器后,我们的 ...
最新文章
- php打印出来乱码_PHP输出中文乱码的解决方法(转载)
- Java指令启动jar
- Android移动开发者必须知道的Deep Linking技术
- WAVE SUMMIT平行论坛 :产教融合,人才共育
- mysql odbc 安装配置过全过程
- lua cURL使用笔记
- 如何做好一场技术演讲?
- 并查集 (Union-Find)算法
- 项目中的软件需求说明书的访谈部分
- jetson nano 在opencv拉流的视频上显示中文汉字(含c++完整源码)
- 剑指Offer之二叉树与双向链表
- siki暗黑战神项目总结,框架和主要的优化点
- 斐讯k2怎么设置虚拟服务器,设置斐讯K2路由器上网连接教程 | 192路由网
- 只有天空才是你的极限,我们热爱探索的过程并沉浸其中丨图数据库 TiMatch 团队访谈
- XTU 1148 三角形
- vue 批量下载图片并打包成压缩包
- golang it营_深入理解Go-垃圾回收机制
- 高通7x27a平台UART配置
- 双馈风机并网simulink模型
- 《机器学习》慕课版课后习题-第5章
热门文章
- [转载]提升进程权限-OpenProcessToken等函数的用法
- HDU 3651 A Simple Problem
- 当head遇上runat=server之后发生的纠结之事
- Asp.net(C#)利用File Field多文件上传
- CCF201604-1 折点计数(100分)【序列处理】
- HDU1871 无题【序列处理】
- UVA11577 Letter Frequency【文本】
- ACM程序设计基础(1)题解
- Project Euler Problem 92 Square digit chains
- 理解 static 关键字