- 浏览: 1149809 次
- 性别:
- 来自: 火星郊区
博客专栏
-
OSGi
浏览量:0
文章分类
- 全部博客 (695)
- 项目管理 (48)
- OSGi (122)
- java (79)
- Vaadin (5)
- RAP (47)
- mysql (40)
- Maven (22)
- SVN (8)
- 孔雀鱼 (10)
- hibernate (9)
- spring (10)
- css (3)
- 年审 (6)
- ant (1)
- jdbc (3)
- FusionCharts (2)
- struts (4)
- 决策分析 (2)
- 生活 (10)
- 架构设计 (5)
- 破解 (2)
- 狼文化 (4)
- JVM (14)
- J2EE (1)
- 应用服务器 (1)
- 我的链接 (5)
- 数学 (2)
- 报表 (1)
- 百科 (6)
- Flex (7)
- log4j (2)
- PHP (1)
- 系统 (2)
- Web前端 (7)
- linux (6)
- Office (1)
- 安全管理 (5)
- python (2)
- dom4j (1)
- 工作流 (3)
- 养生保健 (4)
- Eclipse (8)
- 监控开发 (1)
- 设计 (3)
- CAS (1)
- ZK (41)
- BluePrint (3)
- 工具 (1)
- SWT (7)
- google (2)
- NIO (1)
- 企业文化 (2)
- Windoes (0)
- RCP (7)
- JavaScript (10)
- UML (1)
- 产品经理 (2)
- Velocity (10)
- C (1)
- 单元测试 (1)
- 设计模式 (2)
- 系统分析师 (2)
- 架构 (4)
- 面试 (2)
- 代码走查 (1)
- MongoDB (1)
- 企业流程优化 (1)
- 模式 (1)
- EJB (1)
- Jetty (1)
- Git (13)
- IPV6 (1)
- JQuery (8)
- SSH (1)
- mybatis (10)
- SiteMesh (2)
- JSTL (1)
- veloctiy (1)
- Spring MVC (1)
- struts2 (3)
- Servlet (1)
- 权限管理 (1)
- Java Mina (1)
- java 系统信息 (6)
- OSGi 基础 (3)
- html (1)
- spring--security (6)
- HTML5 (1)
- java爬虫搜索 (1)
- mvc (3)
最新评论
-
Tom.X:
http://osgia.com/
将web容器置于OSGi框架下进行web应用的开发 -
chenyuguxing:
你好, 为什么我的bundle export到felix工程中 ...
在Apache Felix中运行bundle -
string2020:
<niceManifest>true</ni ...
Bundle Plugin for Maven -
jsonmong:
OSGI,是未来的主流,目前已相当成熟。应用OSGI比较好的, ...
基于OSGi的声明式服务 -
zyhui98:
貌似是翻译过来的,有很少人在linux上做开发吧
如何成为“10倍效率”开发者
【导读】
MySQL采用开放可插入式存储引擎架构,提供类似电源插线板的功能,其后接入的存储引擎就类似电器设备,而我们大家常用的存储以MyISAM和InnoDB为主,早期大家主要使用MyISAM引擎支持业务,随MySQL支持业务范围越来越广,存储的数据对企业越来越重要,尤其PC服务器支持的最大内存越来越大,内存的价格也越来越便宜,逐渐采用InnoDB引擎为主.二种风格迥异的存储引擎,各自内部存储算法和数据操纵实现等都竞相不同,另外InnoDB引擎与其他商业数据库产品存储引擎也不太相同,为此我们必须根据使用的存储引擎特点,设计合理的数据存储结构和数据操纵方式。本文将围绕InnoDB存储引擎的主键设计而展开,告诉大家怎样设计表的主键才是合理的做法。
讨论InnoDB引擎表的主键选型的要求之前,我们大家先简单温习下InnoDB引擎表的元数据和索引数据存储结构特点。
InnoDB引擎表的数据和索引都是存储在同一个文件中,InnoDB引擎的页大小默认为16K,且页空间使用率为15/16,为此每页能存储的数据量是有限的。主键和数据的关系是数据存储在簇索引的叶子节点中,接下来我们看下主键和数据的组织结构关系,如图1-1:
图 1-1
对于非簇索引,又是如何存储的呢?通过翻译官方文章,得知:每个非簇索引的叶子节点存储的数据都包含簇索引的值,然后通过簇索引的值,可以查找到对应的元数据,我们继续看一下非簇索引的存储结构,以及与簇索引之间的关系,如图1-2:
图 1-2
紧接着,我们来理清楚InnoDB引擎表的簇索引为哪三类:
l 主键也即是我们文章说的簇索引;
l 若表中无主键,但是存在唯一索引,且字段定义为非空,则作为簇索引;
l 表无主键,也无 非空唯一索引,则内部默认隐含性创建一个长度为6个字节的字段作为簇索引字段;
通过上述探讨和分析,弄清楚了数据存储页的空间值和利用率、簇索引和非簇索引的存储结构,以及簇索引和元数据、簇索引和非簇索引的存储关系,以及簇索引为哪三类,那么我们建议大家一定要为InnoDB引擎表创建一个主键,没必要搞一个唯一性索引且字段定义属性非空,而不创建主键的表结构,我们再分析优秀主键具备的素质:值域范围够用且存储长度越短、值的唯一性和易比较性、数值的有序性增加,三个素质的各自优点,单独详细分析。
l 主键的值域够用且长度越短,将产生三个方面的优势
(1). 相同数据行数的表,数据容量越小,占用磁盘空间越少,为此可以节约物理或逻辑IO和减少内存占用;
(2). 普通索引的长度也将更短,可以减少通过普通索引搜索数据的物理或逻辑IO;
(3). 减少索引数据存储的页块裂变,从而提高页的利用率,以及减少物理IO;
l 主键的唯一性
(1). 主键的值要求必须唯一,且非空;
(2). 主键值每次插入或修改,都必须判断是否有相同值,为此减少索引值需要比对的长度,可以提高性能,或者间接地让其转换成比对数值大小的方式,提高其比对判断的效率;
l 主键值插入的有序性,将产生二个方面的优势
(1). 主键存储的块与块之间是有序的,然后块内有也是有序的,主键值的有序插入,可以减少块内的排序,节约磁盘物理IO;
(2). 主键值的有序性,可以提高数据舒顺序取速度,提高服务器的吞吐量,也可以节约物理IO;
上述讨论的数据存储结构及关系,以及主键字段要求的素质等理论知识之外,我们还需要考虑实际生产环境的业务、架构等综合因素,我们实际生产环境可能会使用四类属性作为主键:
(1). 自增序列;
(2). UUID()函数生成的随机值;
(3). 用户注册的唯一性帐号名称,字符串类型,一般长度为:40个字符;
(4). 基于一套机制生成类似自增的值,比如序列生成器;
那么我们接下来,再分析下这四类属性各自作为表主键的优缺点:
(1). 自增序列:从小到大 或从大到小的顺序模式增加新值;数据类型也利于进行主键值比较;存储空间占用也相对最小,一般设置为:4个字节的INT类型或 8个字节的BIGINT类型;若是想进行数据水平拆分的话,也可以借助设置mysqld实例的2个参数:auto_increment_increment 和 auto_increment_offset;另外,唯一缺点就是自增序列是一个表级别的全局锁,在5.0系列大规模并发写的时候,因锁释放机制的问题容易出现瓶颈,但是5.1系列做了改进,基本上不存在此问题;
(2). UUID()函数:值为随机性+固定部分,其值产生是无序的,且同一台服务器上产生的值相同部分为77.8%;产生的值字符个数为36,按utf8编码计算,占用的存储空间为36个字节;对于数据水平拆分支持,无需特殊设置;
(3). 使用用户注册的帐号名称,字符串类型,其值的产生依赖用户输入,为此数据基本上为无序增加,字符串的长度也是不定的,只能通过前段技术控制最短最大长度值的限制,对水平拆分支持,无需做特殊设置;
(4). 序列生成器的架构,类似自增序列,不过需要借助额外的开发工作量,以及提供一个第三方的服务,可以规避自增序列的字增全局锁的问题,提高并发,对数据水平拆分可以更好地支持;
(5). 双主复制架构的概率性碰到的场景:主服务器的数据执行成功,而没有复制到在线备用服务器时,出问题的概率确实存在,其他类型的做法,也必须人工干涉解决,都无简单且合理的自动化办法,以上四种办法都无法规避;
通过四种属性值作为主键的优缺点分析,以及对比前面我们阐述的主键需要的优秀素质,若是不考虑水平拆分的问题,带来额外设置上的麻烦,则自增序列是最佳的主键字段选择;用户的注册帐号本身要求唯一性且非空的场景下,则可以作为主键字段的选择;若是考虑水平拆分的问题,则采用自增序列生成器的架构,非常易用和可靠的实现方式,产生的值是最佳主键字段的选择;
【结束】
使用什么类型的字段属性作为主键,最关键核心的要考虑存储引擎:如何存储元数据、如何检索元数据、如何维护其内部的索引组织结构,以及我们要实现的业务是什么,最后共同决定我们,如何设计一张用于存储数据的表,以及决定操纵数据的SQL语句如何编写,再结合业务特点就决定了我们的索引如何创建,建议大家多关注InnoDB引擎内部实现原理和机制,可以阅读官方提供的一个文档InnoDB引擎内部实现,以及多分析和关注业务特点。
发表评论
-
MySQL中GBK与UTF-8的区别
2013-02-11 17:53 1600在MySQL中,如果数据库只需要支持一般中文,数据量很大,性 ... -
MySQL中Utf8_general_ci 和 utf8_unicode_ci的区别
2013-02-11 17:51 1251对中、英文来说没有实质的差别。 utf8_gener ... -
Illegal mix of collations (utf8_general_ci,COERCIBLE) and (latin1_swedish_ci,NUM
2012-11-09 11:13 7454SHOW VARIABLES LIKE 'coll%'; ... -
修改MySQL字符编码
2012-11-07 08:24 1008修改编码其实是为了支持中文~ 1. 编译级别。由于缺乏 ... -
INNER LEFT RIGHT JOIN
2012-09-07 10:35 1147CREATE TABLE `a` ( `a1` VARC ... -
MySQL设置字符集为UTF8(Windows版)
2012-08-07 08:40 8923Windows版MySQL设置字符集全部为utf8的方式 ... -
【绿色MySQL设置技巧】
2012-07-07 21:31 12161. mysql 远程连接数据 ... -
查询表Y中数据不存在与表X中的数据使用Left JOIN
2012-06-26 12:39 1102看看我写的对不对,查询接着显示表Y中的数据8,4,p 表X有 ... -
mysql 性能优化方案
2012-04-28 17:18 1024网上有不少mysql 性能优 ... -
设置自动清理mysql binlog日志和手动删除的方法
2012-04-28 17:17 1649MYSQL主从复制(replication)采用 RBR 模式 ... -
自增序列产生器的实现思路
2012-04-28 11:45 937l 需求 u 实现MySQL自带的字段值自动增 ... -
数据库设计范式
2012-04-14 11:05 1013数据库设计三范式 第一范式(1NF):数据库表中的字段都是单一 ... -
11 条重要的数据库设计规则
2012-04-14 11:03 993在你开始阅读这篇文章 ... -
11 步教你选择最稳定的 MySQL 版本
2012-04-01 19:59 1107MySQL开源数据库有多个重要分支,目前拥有的分支分别为:My ... -
连接MySQL数据库生成JavaBean
2012-03-28 08:28 9391做网站时,感觉数据库的设计比较重要,当花了很多时间设计好数据库 ... -
MySQL 分区
2012-03-06 10:31 1209MYSQL 存储过程,定义告 ... -
POWERDESIGNER 教程
2012-02-26 12:03 1481一)概念数据模型 目标 : 本文主要介绍Powe ... -
powerdesigner 使用的十五个问题
2012-02-24 14:22 1327PowerDesigner的主要作用一般还是数据库建模,并生成 ... -
数据库设计原则
2012-02-21 07:41 1031原始单据与实体之间的关系 可以是一对一、一对多、多对多的关 ... -
修改mysql root的密码
2012-01-20 08:38 1008mysql> UPDATE mysql. ...
相关推荐
然而,InnoDB Cluster也有一些限制,比如要求所有表必须使用InnoDB引擎和唯一主键,以支持冲突检测。此外,维护InnoDB Cluster需要一定的成本,包括定期备份和监控,以及深入理解其工作原理。 总之,云原生环境下的...
7. **性能优化**:这包括合理设置存储引擎(如InnoDB和MyISAM),调整事务隔离级别,优化SQL查询,使用存储过程和触发器,以及监控和分析数据库性能。 8. **安全性**:权限管理是数据库设计的重要环节,应设定不同...
MySQL 5.1.53作为数据库系统,并且需要支持InnoDB引擎;使用PHPMyAdmin、SQLyog或Navicat for MySQL作为查询浏览工具等。 - **系统环境**:文档详细列出了系统所需的运行环境,包括操作系统、数据库版本和相关工具的...
然而,在某些场景下,尤其是使用InnoDB作为存储引擎时,`COUNT(*)`可能会导致性能瓶颈。本文将深入探讨`COUNT(*)`性能差的原因,并提供几种优化策略。 ##### 1.1 COUNT(*)性能不佳的原因 - **InnoDB与MyISAM的区别...
- 选择合适的存储引擎,如InnoDB,支持事务处理。 - 设计索引策略,加速查询速度。 #### 四、系统实施 **实施步骤:** - 建立基本信息代码,包括实体的属性定义。 - 实现系统功能,如教室预订、课程安排、数据统计...
总结来说,MySQL性能优化是一个多方面的过程,涉及到硬件选型、软件配置、数据表设计、索引管理等多个方面。通过合理的规划和细致的调整,可以显著提升MySQL的整体性能。希望以上内容对大家在进行MySQL性能优化时...
7. **存储引擎**:MySQL支持多种存储引擎,如InnoDB(支持事务和行级锁定)和MyISAM(非事务处理,快速读取)。选择合适的存储引擎取决于应用的特性,如并发访问、数据一致性或读写速度。 8. **数据库优化**:性能...
这主要是因为 **Percona Cluster** 目前仅支持 **InnoDB** 表,并且建议每个表都拥有自增主键。 - 节点脱离问题: 在使用过程中,可能会遇到节点脱离集群的情况,这通常是因为多个节点同时对同一记录进行了更新。...
首先,在MySQL中创建了一个名为`skybase`的数据库,并在其中定义了一个`user`表,该表包含`id`、`username`和`password`三个字段,其中`id`为主键且自动递增。表结构定义如下: ```sql CREATE TABLE `user` ( `id`...
- **优化MySQL参数**:例如设置`innodb_flush_log_at_trx_commit`为0,减少每次事务提交时的日志刷新频率,提高性能但牺牲了一定的安全性。 - **使用高性能硬件**:采用物理主机而非虚拟机,使用SSD磁盘提升I/O...