`
zhengdl126
  • 浏览: 2538702 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

数据表横向切分法思路--启发很大

阅读更多

地址:http://bbs3.chinaunix.net/thread-1498019-1-1.html

 

 

 

简单说明一下,假设原始表结构:

ID username
email passwd ...
10000001 小强 aa@qq.com
xxxxxxxxxxxx ...
10000002 张三 bb@gmail.com xxxxxxxxxxxx ...
... ... ... ... ...



以用户名做hash把所有用户打散到不同的表,如取md5('小强')的首英文字母(hash方法很多,这边简单以md5示例)进行横向分表后假设创建如下表名:
users_a、users_b、users_c、users_d、.....、users_other
users_a 设置主健基数 10000000
users_b 设置主健基数 20000000
users_c 设置主健基数 30000000  
....


这样以后,若我们查询  username='小张',则hash后得到小张所在的表名为 users_a,构建sql语句:
select * from users_a where username='小张';

若我们查询用户  ID=21001234,则可间接得到ID21001234所在的表名为 users_b,构建sql语句:
select * from users_b where ID=21001234;
以上这些办法都能在分表后大幅提升数据库查询性能。





但是,虽然解决了使用ID和username查找的问题,如果我想查找 email='xxxx@xxx.com' 怎么办?

首先建立该字段与主键ID的映射关系表结构如下:

email ID
aa@qq.com 10000001
bb@gmail.com 10000002
... ...



其次,针对email的值进行散列/分表,拆分为 email_a、email_b、email_c.....
简单地理解就是:
email_a存放的是以邮件a开头的所有email地址及其对应的用户ID;
email_b存放的是以邮件b开头的所有email地址及其对应的用户ID.....


这样以后,若我们查询  email='aa@qq.com',则可得到该email所在的表名为 email_a,构建sql语句:
select ID from email_a where email='aa@qq.com';
得到用户ID,并根据ID查找到用户数据,实则也是一种自创索引。


总知在大数据量、大并发应用中分表是很必要且很繁琐的工作,而且很多时候衍生出分库乃至分服务器等,在此也仅仅浅显地表达一些思路,希望以此抛砖引玉,理解得不好的地方还请海涵。

分享到:
评论

相关推荐

    中不变质量和高横向动量下Drell-Yan过程的描述困难

    我们考虑的数据是轻子对的质量常数Q在4.5和13.5 GeV之间,且横向动量qT的值类似(尽管稍小)。 我们通过基于标准共线性分解得出预测来解决该问题,预计该预测对频谱的高qT端有效,并且最终需要使用横向动量依赖的...

    PickerView横向滑动

    在压缩包中的`YsrollMainActivity`文件很可能是实现这个功能的主活动代码。在这个文件中,我们可以看到如何将上述步骤具体化,包括初始化PickerView,设置适配器,以及处理滚动事件的细节。 总的来说,实现...

    基于JQuery横向跑马灯jQuery-easyAccordion

    【jQuery-easyAccordion】是一个基于JQuery库的插件,用于实现横向跑马灯效果,为网站添加动态、交互式的导航或展示功能。这个插件的设计理念是简化开发者的工作,提供一个易于使用的工具来创建优雅的横向滚动效果,...

    gridview固定表头的一个具体实例----横向滚动 纵向滚动

    ### GridView固定表头实现——横向滚动与纵向固定 在网页应用开发中,特别是涉及到大量数据展示的情况下,如何优雅地处理表格中的数据展示成为一个重要的技术挑战。本文将通过一个具体的实例来探讨如何实现在使用...

    vue-timeLine.vue

    利用vue-element的步骤组件el-steps实现横向时间轴,实现点击时间轴的时间节点动态的加载订单数据列表进行展示

    横向纵向菜单--JQuery实例

    横向菜单通常位于页面顶部,而纵向菜单则常出现在侧边栏。本实例将深入探讨如何使用jQuery库来实现这两种类型的交互式菜单,为用户提供更友好的界面体验。 jQuery是一个广泛使用的JavaScript库,它简化了DOM操作、...

    IOS-横向-TableView-Demo

    总结起来,"IOS-横向-TableView-Demo"是一个iOS开发中的案例,它展示了如何通过自定义UITableView及其相关协议,实现既能横向滚动也能纵向滚动的表格视图,并且支持数据复用,提高性能。这对于那些希望在iOS应用中...

    ios-横向滑动选择器-使用简单-丰富自定义.zip

    可以横向滚动的选择器,也可以用来当页面指示器。 使用简单,自定义方便。 详细使用说明见Github:https://github.com/976431yang/YQNumberSlideView

    gridview固定表头 横向滚动 纵向固定

    "GridView固定表头横向滚动纵向固定" GridView是一个基于ASP.NET的数据控件,用于显示数据表格。然而,在默认情况下,GridView的表头无法固定在屏幕上,使得用户体验不佳。为了解决这个问题,本文将介绍如何实现...

    横向数据重复的插件dw插件

    标题中的“横向数据重复的插件dw插件”指的是在数据处理领域中,用于检测和处理数据表中横向数据重复问题的一种工具。DW通常代表Data Warehouse(数据仓库),这是一个专门用于数据分析的系统,用于整合来自不同来源...

    select 横向滚动条

    在IT行业中,"select 横向滚动条"是一个常见的前端开发话题,涉及到网页界面设计和用户体验优化。在网页设计中,下拉选择框(`<select>`元素)经常用于提供多个选项供用户选择。然而,当选项过多时,传统的垂直滚动...

    横向菜单 bootstrap 后台模板

    【横向菜单 Bootstrap 后台模板】是一款基于Bootstrap框架设计的后台管理界面模板,适用于构建颜色较为淡雅的Web应用程序。Bootstrap是Twitter推出的一款开源的前端框架,它提供了丰富的CSS样式和JavaScript组件,...

    数据库水平切分的实现原理解析

    水平切分,又称分片(Sharding),是一种数据分区方法,将数据按照一定的规则分布到多个数据库或表中,从而实现数据库的横向扩展。在MySQL等数据库中,虽然5.0版本之后引入了表分区功能,但早期的扩展性需求更多依赖...

    PB 纵向显示N-UP类型的数据窗口例子

    在传统的N-UP布局中,数据通常是横向排列的,每行显示N条记录。然而,在这个例子中,我们关注的是纵向显示,这意味着记录将沿着垂直方向堆叠,这对于屏幕空间有限或需要垂直比较数据的场景非常有用。 要创建一个...

    大数据量的系统的数据库结构如何设计

    - **横向切分**:即将频繁查询的数据与不常用的数据分开存储于不同的表中,这种做法有助于减轻查询负担,提高查询效率。 - **纵向切分**:将不同类型的数据分割至不同的表中,这种策略有利于数据管理,同时能够优化...

    WPF_ListView横向显示.zip

    3. **性能优化**:当数据集很大时,使用虚拟化(Virtualization)技术可以提高性能。设置`VirtualizingStackPanel.IsVirtualizing="True"`并指定适当的`VirtualizingStackPanel.VirtualizationMode`。 4. **样式和...

    数据结构——横向搜索图

    C语言实现的数据结构横向搜索图,自己写的,很精简。

    FastReport 数据单元格格纵向横向合并功能实现

    本文将详细介绍如何在FastReport中实现数据单元格的纵向和横向合并功能,以及如何通过修改核心源代码`frxEngine.pas`和`frxClass.pas`来实现这一特性,并附带了样式文档供参考。 1. **单元格合并概述** - 在报表...

    sql 2005 纵向表横向输出存储过程

    总之,这个“sql 2005 纵向表横向输出存储过程”是数据库管理和数据分析中的一个重要工具,它利用了SQL的PIVOT功能,结合动态SQL,使得在面对变化的数据结构时也能高效地完成数据转换,极大地提高了数据处理的灵活性...

Global site tag (gtag.js) - Google Analytics