- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
handlersocket 插件是否知道表上可能的分区?我没有在相关文档中找到提及,我什至不知道分区是否对处理程序套接字透明,或者它是 sql 优化器所做的事情。
最佳答案
简答:
HandlerSocket 对分区表工作良好(意味着支持所有操作),但它不知道任何分区。不尝试分区修剪,因此当 handlersocket 与分区表一起使用时会产生性能开销。
长答案:
MySQL 中的分区是在不同级别实现的:解析器、通用处理程序、查询优化器。通用处理程序 (ha_partition) 为 native 不支持它的引擎提供分区(除 NDB 之外的所有引擎)。这个处理程序实现了一种责任链模式:它将自己插入服务器和底层引擎的普通处理程序之间(每个分区一个)。
执行查询时,ha_partition 处理程序将操作转发给与每个分区对应的所有底层处理程序。这就是为什么您可以为 InnoDB、MyISAM 等提供相同的分区支持......
分区修剪(即过滤掉分区上无用的查找/扫描)在查询优化器中实现,而不是在 ha_partition 处理程序中实现。所以基本上当通过 ha_partition 完成查找时,如果优化器没有限制分区列表,查找将在所有分区上完成,然后使用合并算法并行读取 n 个游标。
以下presentation由 Mattias Jonsson 和 Mikael Ronström (Oracle) 撰写,对于理解如何在 MySQL 中实现分区非常有用。
现在 HandlerSocket 插件直接基于通用处理程序。 HandlerSocket 级别没有分区知识。当对分区表应用 HandlerSocket 查询时,将以透明方式使用 ha_partition 处理程序。
好消息是 HandlerSocket 可以很好地处理分区表,无需额外费用。坏消息是它无法从分区修剪中获益,因为这仅在 SQL 查询优化器中实现。
这是一个证明它的例子(针对 Percona Server 5.5 测试)。我们将使用 2 个表:mytable_np 未分区,mytable 已分区。
create table mytable_np ( id int, x varchar(100), primary key(id), key(x) )
engine=InnoDB ;
insert into mytable_np values ( 1, 'A' );
insert into mytable_np values ( 11, 'B' );
insert into mytable_np values ( 21, 'C' );
insert into mytable_np values ( 31, 'D' );
insert into mytable_np values ( 41, 'E' );
insert into mytable_np values ( 51, 'F' );
commit;
create table mytable ( id int, x varchar(100), primary key(id), key(x) )
engine=InnoDB
partition by range (id) (
partition p0 values less than (10),
partition p1 values less than (20),
partition p2 values less than (30),
partition p3 values less than (40),
partition p4 values less than (50),
partition pend values less than (1000)
);
insert into mytable values ( 1, 'A' );
insert into mytable values ( 11, 'B' );
insert into mytable values ( 21, 'C' );
insert into mytable values ( 31, 'D' );
insert into mytable values ( 41, 'E' );
insert into mytable values ( 51, 'F' );
commit;
可以执行以下查询来执行简单的主键访问:
select * from mytable where id = 51 ;
select * from mytable_np where id = 51 ;
以下 netcat/telnet 脚本可用于使用 HandlerSocket 进行查询(注意 TAB 字符):
P 0 test mytable PRIMARY id,x
0 = 1 51
P 0 test mytable_np PRIMARY id,x
0 = 1 51
为了评估查找次数,可以在每次查询执行前后执行以下查询以计算处理程序键访问的次数:
show global status like 'Handler_read_key' ;
如果我们测量在四种情况下完成的处理程序 key 访问次数,我们得到:
SQL query against non partitioned table: 2
SQL query against partitioned table: 2
HandlerSocket against non partitioned table: 2
HandlerSocket against partitioned table: 7
在前三种情况下,我们有一个查找来查找行,加上一个额外的键访问来检查这是要读取的最后一行。在最后一种情况下,我们对每个非空分区进行一次查找。其中有 6 个。 key 只会在其中一个中找到,并且会进行额外的访问以检查是否只有一个匹配行。所以结果是 7。
这个例子证明,即使在最简单的情况下(主键访问),HandlerSocket 也无法修剪分区。当对分区使用 HandlerSocket 时,应该总是会出现性能损失。分区越多,开销越高(线性)。
关于Mysql、handlersocket 和分区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8477515/
是一种在 Neo4j 分区之间进行物理分离的方法吗? 这意味着以下查询将转到 node1: Match (a:User:Facebook) 虽然此查询将转到另一个节点(可能托管在 docker 上)
我尝试在我的 SQL 服务器上使用分区函数对我的一个大表进行分区,但我收到一条错误消息 “只能在SQL Server企业版中创建分区功能。只有SQL Server企业版支持分区。” 所以我想知道没有企
在hadoop文件系统中,我有两个文件,分别是X和Y。通常,hadoop制作的文件X和Y的大小为64 MB。是否可以强制hadoop划分两个文件,以便从X的32 MB和Y的32 MB中创建一个64 M
据我了解,如果我们有一个主键,则使用该键对数据进行分区并将其存储在节点中(例如使用随机分区器)。 现在我不确定的是,如果我有多个键(又名复合键),是用于分区数据的键的组合还是它将是第一个主键? 例如,
我正在向我的 SSAS 多维数据集添加分区,我想知道是否有多个分区可以保留在下面?多少太多了,最佳实践限制是 20 还是 200?有没有人可以分享任何真实世界的知识? 最佳答案 这是 another
我有一个包含大约 200 万条记录的大表,我想对其进行分区。 我将 id 列设置为 PRIMARY AUTO_INCRMENT int (并且它必须始终是唯一的)。我有一列“theyear”int(4
我正在做 mysql 列表分区。我的表数据如下 ---------------------------------------- id | unique_token | city | student_
我有一个表,我们每天在其中插入大约 2000 万个条目(没有任何限制的盲插入)。我们有两个外键,其中一个是对包含大约 1000 万个条目的表的引用 ID。 我打算删除此表中超过一个月的所有数据,因为不
我想在一款足球奇幻游戏中尝试使用 MySQL Partitioning,该游戏的用户分布在联赛中,每个联赛都有一个用户可以买卖球员的市场。当很多用户同时玩时,我在这张表中遇到了一些僵局(在撰写本文时大
我是 jQuery 的新手,想知道是否可以获取一些变量并将它们的除法作为 CSS 宽度。到目前为止我在这里: var x = $(".some-container").length; var y =
所以我正在做家庭作业,我需要为分区、斯特林数(第一类和第二类)和第一类的切比雪夫多项式创建递归函数。我的程序应该能够让用户输入一个正整数 n,然后创建名为 Partitions.txt、Stirlin
我在数据框中有一列,其中包含大约 1,4M 行聊天对话,其中每个单元格中的一般格式为 (1): “名称代理 : 对话” 但是,并非列中的所有单元格都采用这种格式。有些单元格只是 (2): “对话” 我
我在尝试隐藏 a 时遇到了一些问题,直到用户单击某个元素为止。 HTML 看起来像: BRAND item 1 item 2 item 3
一.为什么kafka要做分区? 因为当一台机器有可能扛不住(类比:就像redis集群中的redis-cluster一样,一个master抗不住写,那么就多个master去抗写)
我有一些销售数据,我需要发送存储在单独表中的可用槽中的数量。 销售数据示例: id数量112131415369 create table sales (id serial primary key, q
我计划设置多个节点以使用 glusterfs 创建分布式复制卷 我使用主(也是唯一)分区上的目录在两个节点上创建了一个 gluster 复制卷。 gluster volume create vol_d
我正在尝试使用 sum() over (partition by) 但在总和中过滤。我的用例是将每个产品的 12 个月累计到一个月的条目,因此: ITEM MONTH SALES Item
是否可以创建多个 Enumerators出单Enumerator ? 我正在寻找的相当于 List.partition返回 (List[A], List[A]) ,比如 List().partitio
我正在创建一个基于 x86 的非常简单的 Yocto 图像。 我希望/文件系统是只读的,所以我设置了 IMAGE_FEATURES_append = " read-only-rootfs " 在原件的
是否可以使用一次 collect 调用来创建 2 个新列表?如果没有,我该如何使用分区来做到这一点? 最佳答案 collect(在TraversableLike上定义并在所有子类中可用)与集合和Par
我是一名优秀的程序员,十分优秀!