- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个很大的表,里面有将近 3 亿条记录。由于 select 查询对我来说太慢了,我想将它拆分成大约 800 个小表。
数据集如下所示:
XXXXXX column2 column3 column4 ...
XXXXXX column2 column3 column4 ...
XXXXXX column2 column3 column4 ...
YYYYYY column2 column3 column4 ...
YYYYYY column2 column3 column4 ...
我想根据第一列的值拆分表(例如,将带有 XXXXXX
的记录拆分为表 XXXXXX
),最快的方法是什么?
注意:我已经为它添加了 10 个分区,但它并没有很好地加速它。
最佳答案
分区在两种情况下作为性能策略起作用:
该表的主要查询最终执行表或索引扫描,并且在具有足够资源和适当配置的系统上执行高级别并行性。因此,如果所有分区都在同一个物理驱动器上,那对您来说意义不大,因为您与最初一样受到 I/O 限制。但是,如果您使用的是 16 核系统,每个分区都位于物理上不同的磁盘上?分区可能会对系统性能产生惊人的改进。
分区规则使用的索引经常用于针对该表的最普遍查询。如果您要通过该路线获得性能,则应该根据通常用于过滤或约束结果集的索引值进行分区。最常见的候选者是交易日期,因为报告通常是按日历日期范围进行的。然后,查询优化器可以使用分区规则将操作限制到单个(较小的)分区,或者并行运行两个或多个分区扫描(受上述相同限制)。
我假设想要拆分此表的主要原因是为了性能。但是800个分区?如果性能改进是您所追求的,那可能是错误的方法。企业数据库在缓存内存中保留尽可能多的顶级表索引以获得良好的性能。在一个五级 b 树中,对于一个适度使用的表,很可能前三级在第一次访问后总是保留在缓存中(这是一个具有整数主键的 300M 行表的可能配置) .通过将表拆分为 800 个部分,这意味着将有 800 个数据结构试图保持缓存(除了表数据本身)。很有可能,如果您的访问或多或少按主键均匀分布,那么在一个分区上搜索最终会将其他分区推出缓存,最终损害整体性能。
不过,如果您决定这样做,将表分区为 N 个部分的最简单方法是根据主键(primary_key % 800
,在你的情况下)。较新版本的 MySQL 也支持散列分区,使得分区成任意数量的集合相当简单:
PARTITION BY HASH(some_column_value) PARTITIONS number_of_partitions
如果您想将数据放入 800 个实际表中,则必须使用编辑器魔术,或使用脚本语言,并在 SQL 中执行:
CREATE TABLE table1 LIKE MasterTable
CREATE TABLE table2 LIKE MasterTable
CREATE TABLE table3 LIKE MasterTable
..
INSERT INTO table1 SELECT * FROM MasterTable WHERE id MOD 800 = 0
INSERT INTO table2 SELECT * FROM MasterTable WHERE id MOD 800 = 1
INSERT INTO table3 SELECT * FROM MasterTable WHERE id MOD 800 = 2
您可以使用动态 SQL 在您最喜欢的编程语言中循环执行此操作:这可能是最容易呈现的。
关于MySQL:将大表拆分成小表的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17905116/
什么是更快的安卓? Color.rgb(184, 134, 011); 或 Color.parseColor("#234181"); 还是别的什么? 答案:最快的似乎是: int mycolor =
没错, 基本上我需要计算出从服务器到最终用户的最短路线。我有 2 台服务器 - 一台在英国,一台在美国。 我需要根据最终用户的位置确定从哪个服务器加载内容。 我最初想使用 fsock/curl/fgc
我正在阅读固定宽度整数类型 ( cpp reference) 并遇到int_fast8_t、int_fast16_t、int_fast32_t 和 int_least8_t 类型,int_least1
Closed. This question is opinion-based。它当前不接受答案。 想改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。 6年前关闭。
我有大量目录,我想尽快读取所有文件。我的意思是,不是 DirectoryInfo.GetFiles 快,而是“get-clusters-from-disk-low-level”快。 当然,.NET 2
我尝试寻找最小的可被1到n整除的数字,现在我正在寻求有关进一步压缩/使我的解决方案更有效的方法的建议。如果也有O(1)解决方案,那将非常酷。 def get_smallest_number(n):
有很多不同的方法可以在驱动程序之间选择元素。我想知道哪一个最快且最适合 native 应用程序(iOS 和 Android)。 Appium Driver 类有: findElementByAcces
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
让矩阵 A 说 A = magic(100);。我见过两种计算矩阵 A 的所有元素之和的方法。 sumOfA = sum(sum(A)); 或者 sumOfA = sum(A(:)); 其中一个比另一
我想为玩具车在没有障碍物的平面 (2d) 上规划一条路线。玩具车应该从点 (p1x,p1y) 移动到 (p2x,p2y)(又名狄利克雷边界条件)。此外,玩具车在起点的速度是(v1x,v1y),终点处要
假设有 n 个 3 维对象(多面体)。最快的方法是计算所有对象的交集O(n^2)? 现在,我正在使用一个基本上强制 T(n) 等于 n ^ 2 的库: for each object: // ther
关闭。这个问题需要 details or clarity 。它目前不接受答案。 想改进这个问题吗? 添加细节并通过 editing this post 澄清问题。 关闭 5 年前。 Improve
在 c: 上,我有数以万计的 *.foobar 文件。它们在各种各样的地方(即子目录)。这些文件的大小大约为 1 - 64 kb,并且是纯文本。 我有一个 class Foobar(string fi
我的基本问题是有多个线程做一些事情,其中一些需要比其他线程更多的时间(20 倍甚至更多),他们需要的时间只取决于起始值,但不能从起始值预测单独他们需要多少时间。为了减少更快线程的空闲时间,我想通过
好的,我有一个疑问: select distinct(a) from mytable where b in (0,3) 什么会更快,上面的还是 select distinct(a) from myta
问题简介: 我正在开发一个生态生理模型,我使用了一个名为 S 的引用类列表。存储模型需要输入/输出的每个对象(例如气象、生理参数等)。 此列表包含 5 个对象(请参见下面的示例): - 两个数据帧,S
我有一个正在工作的问题陈述,但我仍然想知道更高效、更快,更重要的是正确设计来处理下面提到的场景。 我有一个 POJO 类 class A { String s; Double d; } 我正在
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 3 年前。 Improve this q
关于 LLVM 如何优化代码,关于 SO 以及整个网络都有一些非常好的描述。但这些都无法回答我的具体问题。 在 Xcode 中,项目和目标设置中有各种代码优化选项。我理解在开发过程中不需要优化,但为什
我正在用 C# 开发一个服务器项目,在收到 TCP 消息后,它会被解析并存储在一个精确大小的 byte[] 中。 (不是固定长度的缓冲区,而是存储所有数据的绝对长度的字节[]。) 现在为了阅读这个 b
我是一名优秀的程序员,十分优秀!