关于databaes:如何选择合适的分表键路由规则分片数

一、分表键的抉择什么是分表键分表键即分库/分表字段,zebra外面叫做维度,是在程度拆分过程中用于生成拆分规定的数据表字段。Zebra 依据分表键的值将数据表程度拆分到每个物理分库中。 数据表拆分的首要准则,就是要尽可能找到数据表中的数据在业务逻辑上的主体,并确定大部分(或外围的)数据库操作都是围绕这个主体的数据进行,而后可应用该主体对应的字段作为分表键,进行分库分表。 业务逻辑上的主体,通常与业务的利用场景相干,上面的一些典型利用场景都有明确的业务逻辑主体,可用于分表键: 面向用户的互联网利用,都是围绕用户维度来做各种操作,那么业务逻辑主体就是用户,可应用用户对应的字段作为分表键;                   侧重于卖家的电商利用,都是围绕卖家维度来进行各种操作,那么业务逻辑主体就是卖家,可应用卖家对应的字段作为分表键;以此类推,其它类型的利用场景,大多也能找到适合的业务逻辑主体作为分表键的抉择。 如果的确找不到适合的业务逻辑主体作为分表键,那么能够思考上面的办法来抉择分表键: 依据数据分布和拜访的平衡度来思考分表键,尽量将数据表中的数据绝对平均地散布在不同的物理分库/分表中,实用于大量剖析型查问的利用场景(查问并发度大部分能维持为1);依照数字(字符串)类型与工夫类型字段相结合作为分表键,进行分库和分表,实用于日志检索类的利用场景。留神:无论抉择什么拆分键,采纳何种拆分策略,都要留神拆分值是否存在热点的问题,尽量躲避热点数据来抉择拆分键。 留神:不肯定须要拿数据库主键当做分表键,也能够拿其余业务值当分表键。拿主键当分表键的益处是能够散列平衡,缩小热点问题。 多个分表键如何解决大部分场景下,一张表的查问条件比拟繁多,只须要一个分表键即可;然而有的时候,业务必须要有多个分表键,没有方法归一成一个。此时个别有四种解决形式: 名词定义: 主分表键=主维度,在主维度上,数据可能增删改查;辅助分表键=辅维度,在辅助维度上,只能进行数据查问在主维度上全表扫描因为SQL中没有主维度,所以在对辅助维度进行查问时,只能在所有的主维度的表进行查问一遍,而后聚合。目前zebra的并发粒度是在数据库级别的,也就是说如果分了4个库,32张表,最终会以4个线程去并发查问32张表,最终把后果合并输入。 实用场景:辅助维度的查问申请的量很小,并且是经营查问,对性能要求不高 多维度数据进行冗余同步主维度的数据,通过binlog的形式,同步到辅助维度一份。那么在查问辅助维度时,会落到辅助维度的数据上进行查问。 实用场景:辅助维度的查问申请的量也很可观,不能间接应用第一种全表扫描的形式 二维奇妙归一维辅助维度其实有的时候也是主维度,比方在订单表Order中,OrderID和UserID其实是一一对应的,Order表的主维度是UserID,OrderID是辅助维度,然而因为OrderID其中的6位和UserID完全一致,也就是说,在OrderID中会把UserID打进去。 在路由的时候,如果SQL中带有UserID,那么间接拿UserID进行Hash取模路由;如果SQL中带有的OrderID维度,那么取出OrderID中的6位UserID进行Hash取模路由,后果是统一的。 实用场景:辅助维度和主维度其实能够通过将主维度和辅助维度的值进行信息共享 建设索引表对于辅助维度能够建一张辅助维度和主维度的映射表。 举例来说,表A有两个维度,主维度a,辅助维度b,目前只有主维度的一份数据。 此时,如果有SQL: select * from A where b = ?过去,那么势必会在主维度上进行全表扫描。 那么建一张新表B_A_Index,外面就只有两个字段,a和b的值,这张表能够分表,也能够不分表,倡议分表这张表的主维度就是b。 所以能够先查:select  a  from B_A_Index where b = ?,取得到a的值,而后 查问 select * from A where a = 查问到的值 and b = ? 进行查问。 试用场景:主副维度是一一对应的。劣势是,无需数据冗余,只须要冗余一份索引数据。毛病是,须要业务进行稍微的革新。 二、分片数的抉择zebra 中的程度拆分有两个档次:分库和分表。 表数目决策个别状况下,倡议单个物理分表的容量不超过1000万行数据。通常能够预估2到5年的数据增长量,用估算出的总数据量除以总的物理分库数,再除以倡议的最大数据量1000万,即可得出每个物理分库上须要创立的物理分表数: (将来3到5年内总共的记录行数)  /  单张表倡议记录行数              (单张表倡议记录行数  =  1000万)表的数量不宜过多,波及到聚合查问或者分表键在多个表上的SQL语句,就会并发到更多的表上进行查问。举个例子,分了4个表和分了2个表两种状况,一种须要并发到4表上执行,一种只须要并发到2张表上执行,显然后者效率更高。 ...

September 28, 2020 · 2 min · jiezi

Laravel-队列-database-驱动今天刚学习了队列记录下笔记

刚学习了laravel队列,把笔记记一下。 1.第一步配置(.env)QUEUE_CONNECTION=database2.database 驱动设置第一步:生成 jobs 数据迁移表 php artisan queue:table效果如下:第二步: 创建jobs表,执行迁移命令 php artisan migrate效果如下: 3.模拟数据第一步: 进入 thinker php artisan thinker第二步:创建数据 (thinker命令) factory(App\User::class,10)->create();// 创建10个用户打开users表 就能看到 创建的10 个新用户 4.创建 Jobs及编写第一步:创建 php artisan make:job Email此时能在 app 目录下生成个 Jobs 文件夹 及我们创建的 Email.php文件 效果如下: 第二步:编写Email.php <?phpnamespace App\Jobs;use App\User;use Illuminate\Bus\Queueable;use Illuminate\Queue\SerializesModels;use Illuminate\Queue\InteractsWithQueue;use Illuminate\Contracts\Queue\ShouldQueue;use Illuminate\Foundation\Bus\Dispatchable;use Illuminate\Support\Facades\Log;class Email implements ShouldQueue{ use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; //定义 public $user; /** * Create a new job instance. * * * @return void */ public function __construct(User $user) { //赋值 $this->user = $user; } /** * Execute the job. * * @return void */ public function handle() { //打印日记 Log::info('发送的邮件是:'.$this->user->email); }}6. 创建控制器,分发任务第一步:创建Usercontroller控制器 ...

May 15, 2019 · 1 min · jiezi

Lumen-报错提示-实例不了-Response-类的问题

今天使用Lumen的时候,用到了Response类,很奇怪提示:Target [Illuminate\Contracts\Routing\ResponseFactory] is not instantiable.大概就是说实例不了Response 类,那怎么解决呢?我们以一个全新的Lumen项目来说1.我在web.php写了个路由<?php/*|--------------------------------------------------------------------------| Application Routes|--------------------------------------------------------------------------|| Here is where you can register all of the routes for an application.| It is a breeze. Simply tell Lumen the URIs it should respond to| and give it the Closure to call when that URI is requested.|*/use Illuminate\Support\Facades\Response;$router->get('/', function () use ($router) { return Response::json('123456',200);});然后访问这个路由报错如下(也就是我们要解决的错误): 2.解决办法2.1 打开项目根目录下的 bootstrap/app.php //找到这两行把注释去掉 $app->withFacades(); $app->register(App\Providers\AppServiceProvider::class);2.2 找到 项目根目录下的 app/Providers/AppServiceProvider.php <?phpnamespace App\Providers;use Illuminate\Routing\ResponseFactory;use Illuminate\Support\ServiceProvider;class AppServiceProvider extends ServiceProvider{ /** * Register any application services. * * @return void */ public function register() { }}在 register 注册 ResponseFactory 修改如下: ...

May 15, 2019 · 1 min · jiezi

Oracle SQL Developer 个人使用记录

Oracle SQL Developer 个人使用记录以下简称 SQL Developer对我Java开发来说,这个工具已经足够使用了,虽然还有很多缺点,但够用就行,相对于我来说的优点:整体UI还算舒服免费跨平台跨数据库Windows 下有解压版,不用安装使用 Java 开发,不需要添加其他的环境(对于非 Java 开发者来说这可能是个缺点)自带中文第三方数据库连接SQL Developer 是通过 JDBC 来连接并管理数据库的,对于类似我这种非DBA来说还是不错的。配置的地方在此:中文版:工具 → 首选项 → 数据库 → 第三方 JDBC 驱动程序英文版:Tools → Preferences → Database → Third Party JDBC DriversMySQLJDBC 驱动下载页:https://www.oracle.com/techne…注:这个版本的 JDBC 驱动连 MySQL8 可能有问题PostgreSQLJDBC 驱动下载页: https://jdbc.postgresql.org/d...Host 主机填写规则: <IP>:<Port>/<Database>?主机填写规则这是个坑,参考此处:https://stackoverflow.com/que…如有其他补充或错误,欢迎留言!

December 18, 2018 · 1 min · jiezi