高性能数据架构设计2011年8月28日
这是一些实践过的简单而有效的数据架构技巧的集合。好的架构不是庞大而看上去完美的,而一定是简单而有效的抛砖引玉,希望能引发关于数据架构的讨论和思考。
用户登录的场景
一个常见的Web应用数据架构场景用户输入用户名和密码登录到系统中系统进行用户名密码检验,如果用户验证有效,则允许用户登录系统用户登录系统之后,显示用户状态,例如用户名,帐户积分,余额或者其他通知与消息
用户登录的数据库操作原型Select UserID from tblUserwhere UserName = ‘LoginName’ and UserPassword = ‘PasswordMD5’
SQL分析功能实现了,性能呢?如果数据库为UTF-8编码LoginName为电子邮件,则长度可能为20-40个字节。Password长度可能为6-20个字节长。则当文本数据索引较大则基于内存的索引查询命中率降低,大量读取磁盘造成性能较慢。解决之道,将UTF-8字段的字符串转换为Hash编码的数值,每个整型数据占用MySQL数据库4个字节。基于内存的索引查询数据量增加将近10倍。
经验总结在进行文本检索的时候,尽量将文本的Hash值进行索引,并通过索引进行查询,以提升系统查询性能。注意采用的Hash算法的冲突较少,算法性能较好。Hash计算之前要首先统一字符串编码。例如,同样”Hello,工程师社区”在通过UTF-8和Unicode编码,Hash数值也会不同。使用自己的Hash算法,而不要使用SDK库提供的Hash算法。不同语言的Hash算法不同。甚至,同一种语言的HashCode()的数值也不同,如.NET Framework。
优化之后的SQL原型Select UserID from tblUserwhere UserNameHash= -1234589  and UserPasswordHash= 123456Select UserID from tblUser where UserNameHash = -1234589 and UserPasswordHash = 123456andUserName = ‘LoginName’ and  UserPassword = ‘PasswordMD5’
获得用户积分信息原型Select sum(tblUserReputation.Reputation), tblUser.UserName, tblUser.UserLevelfrom tblUser, tblUserReputationwhere tblUser.ID = tblUserReputation.UserID
应用分析多表关联查询聚合数据背后的设计数据库索引3NF与2NF实时数据与相对实时数据物化视图(视图索引)
数据库索引数据库索引索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。Hash索引 vs. B-树索引Hash索引可以一次定位B-树索引多次IO,从根节点到枝节点
3NF vs. 2NF3NF多表关联查询,损失性能2NF部分情况下,将常用的用户状态信息,统计信息,定期执行之后以2NF存储,则数据读取性能更好。甚至,在数据表中建立 Setting 字段,通过CSV或者XML格式进行半结构化数据存储,既能保证数据库设计的“弹性”,也可以减小多表关联查询。需要注意的是数据一致性检验和相对实时。
相对实时的场景使用不同的数据管理方式很多场景,数据并不要求绝对实时,只需要相对实时异步队列数据缓存,复制与分发2NF
用户行为与日志类型数据
不同策略集中 vs. 分散数据库 vs. 文件系统同步 vs. 异步CSV vs. XML建议对于日志型数据采用集中存储文件系统分级管理异步存储CSV格式不建议将日志数据存入数据库中。
用户互动与SNS信息
基于内存数据库的缓存技术实时性强、访问频繁、并发访问量大的数据,可以通过内存数据库实现内存数据库特点高性能高速缓存快速实现与部署2011年11月CatchException.NET沙龙将专题讨论
查找内容或人名
全文检索技术全文检索全文检索对于非结构化和半结构化数据进行检索为何不推荐使用SQL Server或者Oracle全文检索分词与噪声词中文分词与逆序词典结构化数据、非结构化数据与半结构化数据
查找人名、地名、机构名称的方法姓名二分法分词基于拼音查找基于首字母缩略词查找通过坡度,确保连续字词查找质量
系统演进与架构腐化
数据架构腐化状态值与状态图的维护过多的补丁造成复杂的多表联合查询字段语义的变化不恰当的非结构化与半结构化数据管理不恰当的日志类型数据管理不恰当的索引设计不恰当的3NF或者2NF设计磁盘碎片与索引碎片
风险与策略
常见的风险缓存数据与数据库内容不一致系统现代化改造过程中字段定义的改变死锁单点故障风险非结构化索引数据存储日志类型数据存储
应对之道存储与服务节点可用性风险基于 NAS / SAN 的存储方案缓存系统的集群反向代理管理集群节点数据处理风险通过Data Engine层封装所有对于数据的操作对外暴露SOA接口,提供服务。例如,Thrift, Web Services, JSON,MQ等。
FAQ问题答疑http://CatchException.NET分享者陆明http://www.catchexception.net/PublicProfile/1/3254785944065506726
近期沙龙计划2011年9月实时交易系统技术方案2011年10月跨平台移动应用开发2011年11月海量数据与高并发系统2011年12月企业IT战略管理与策略报名流程注册CatchException.NET,并完善个人档案和照片报名沙龙http://salon.catchexception.net/?page_id=55费用沙龙免费,如收费另行通知如果在咖啡厅或酒吧举行沙龙,请点一杯咖啡。

Cenet salon.220904-高性能数据架构设计