我目前正在尝试提高MySQL表的SELECTS速度,并希望了解有关改进它的方法的任何建议.
表中有超过3亿条记录,表中有结构标记,日期,值.主键是标签和日期的组合键.该表包含大约600个唯一标签的信息,这些标签大多数包含平均约400,000行但可以在2000到超过1,100万行的范围内.
针对表运行的查询是:
SELECT date,
value
FROM table
WHERE tag = "a"
AND date BETWEEN 'x' and 'y'
ORDER BY date
Run Code Online (Sandbox Code Playgroud)
....如果有任何插入,很少.
我已经尝试按标签将数据划分为不同数量的分区,但这似乎没有增加速度.
mysql sql database-design query-optimization database-partitioning
我正在尝试在分区表中插入信息,但我不知道我做错了什么!告诉我这个错误:ORA-14400: inserted partition key does not map to any partition"
该表dba_tab_partitions显示了以下信息:
1 PDIA_98_20091023 0
2 PDIA_98_20091022 0
3 PDIA_98_20091021 0
4 PDIA_98_20091020 0
5 PDIA_98_20091019 0
Run Code Online (Sandbox Code Playgroud)
请帮帮我
我有一个电信计费软件系统.其中包含用户呼叫的每日日志.日志按日期(月)水平分区.每个分区都存储在一个单独的数据库中,可以分布在多个实例上.
在UI中,用户将指定日期范围.返回的数据可以在任何字段上排序.日期范围可能跨越多个分区.应用程序必须支持通过日期范围的数据进行分页.
我无法将太多记录加载到内存中进行排序.在查询中放置排序只能在一个结果集中提供排序数据.
所以我需要对多个分区中的数据进行排序,每个分区都是单独排序的 如何从多个排序结果集中将已排序记录返回到UI?
编辑:经过对此问题的更多分析,我们有更多的输入.也需要分页.因此,我们需要找到一种方法来对多个结果集进行实时排序.
我是Cosmos DB的新手,我注意到我们可以根据需要设置分区键,以便通过以下代码有效扩展:
DocumentCollection myCollection = new DocumentCollection();
myCollection.Id = "coll";
myCollection.PartitionKey.Paths.Add("/deviceId");
Run Code Online (Sandbox Code Playgroud)
问题是我们可以在创建集合之后更改分区键并指定分区键吗?我可能会发现分区键的选择以后不合适.
当我阅读有关分片的内容时,看起来作者没有考虑到分片表必须连接到的其他表(即使他们将分片描述为“原始数据库的子集”)。但是,这是一种非常常见的情况,我仍然不知道如何处理。一些作者提到了由可复制到每个分片(例如Country)的分片表引用的“静态”表。但是,他们没有提及引用分片表的表。
想象一下,我们运行一个社交网络并意识到我们的User表(id, name)不再适合单个服务器,因为写入量或大小(或两者)。所以我们决定将它水平分割成多个分片(比如 4,所以 id 1-1000 的用户转到一个分片,1001-2000 转到另一个分片等)并选择User.id作为分片键。由于用户表通常连接到其他表,我们将记录从引用给定用户或由它引用的表移动到相应的分片(这是一个很大的挑战,因为关系通常是可传递的,例如,表 A 可能引用 B 引用分片表C)。为了简化事情,我们可以决定将除 User 表之外的所有表完整复制到所有分片。到现在为止还挺好。
然后,想象Friends表(id, user_id,friend_id)包含有关谁是谁的朋友并引用User表的信息。用户 1001 有 2 个朋友,2002 和 3003,他们位于不同的分片上。所以如果我们需要获取用户 1001 个朋友的信息,我们将不得不执行 2 次跨分片连接。即使我们最初设法将所有相关用户放在同一个分片上,用户也可以从不同的分片添加新朋友。我们不能将这个朋友 4004 移动到用户 1001,因为来自同一分片 #5 的其他用户也可以将他作为朋友。
老实说,我无法弄清楚在执行分片时如何处理这种情况,而且我还没有看到任何资源对此进行解释。
假设我的容器中有以下数据:
{
"id": "1DBF704E-1623-4844-DC86-EFA729A5C048",
"firstName": "Wylie",
"lastName": "Ramsey",
"country": "AZ",
"city": "Tucson"
}
Run Code Online (Sandbox Code Playgroud)
当我查询特定分区键时,我使用字段“id”作为项目 id,使用字段“country”作为分区键:
SELECT * FROM c WHERE c.country = "AZ"
Run Code Online (Sandbox Code Playgroud)
(获取“AZ”中的所有人员)
我应该添加“国家/地区”作为索引,还是默认获得它,因为我将“国家/地区”作为分区键?使用 SDK 时是否有区别(即:添加选项new PartitionKey("AZ"),然后发送如上所述的查询)?
我正在为我的应用程序构建数据库存储,该数据库存储包含一个包含大量数据量(数亿条记录)的表.我打算在日期字段上有一个索引,因为我将不时地在给定的时间段内对所有记录进行批量恢复(例如,检索第二天的所有记录,在午夜).
由于记录的数量巨大,性能是这个系统中的一个重要问题,我想知道是否有一种方法可以动态分区我的表,以便我可以更快地检索记录,创建和截断分区,因为它们不是需要更久.例如,在我处理完今天的记录之后,我将如何创建第二天的分区并将其与其余数据一起填充?
我有以下表和索引定义:
CREATE TABLE ticket
(
wid bigint NOT NULL DEFAULT nextval('tickets_id_seq'::regclass),
eid bigint,
created timestamp with time zone NOT NULL DEFAULT now(),
status integer NOT NULL DEFAULT 0,
argsxml text,
moduleid character varying(255),
source_id bigint,
file_type_id bigint,
file_name character varying(255),
status_reason character varying(255),
...
)
Run Code Online (Sandbox Code Playgroud)
我在created时间戳上创建了一个索引,如下所示:
CREATE INDEX ticket_1_idx
ON ticket
USING btree
(created );
Run Code Online (Sandbox Code Playgroud)
这是我的疑问
select * from ticket
where created between '2012-12-19 00:00:00' and '2012-12-20 00:00:00'
Run Code Online (Sandbox Code Playgroud)
这个工作正常,直到记录数量开始增长(约500万),现在它将永远回归.
解释分析揭示了这一点:
"Index Scan using ticket_1_idx on ticket (cost=0.00..10202.64 rows=52543 …Run Code Online (Sandbox Code Playgroud) postgresql indexing query-optimization database-partitioning postgresql-performance
我将300MB表分区并尝试p0使用此命令从分区进行选择查询
SELECT * FROM employees PARTITION (p0);
Run Code Online (Sandbox Code Playgroud)
但我得到了以下错误
ERROR 1064 (42000): You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right syntax to use near '(p0)' at line 1
Run Code Online (Sandbox Code Playgroud)
如何编写select查询以从特定分区获取数据?
PostgreSQL 10引入了带子句的声明性表分区PARTITION BY,我想将它用于Django模型.
原则上我需要做的就是在Django ORM创建PARTITION BY的CREATE TABLE语句末尾引入该子句.
CREATE TABLE measurement (
city_id int not null,
logdate date not null,
peaktemp int,
unitsales int
) PARTITION BY RANGE (logdate);
Run Code Online (Sandbox Code Playgroud)
是否可以将此子句插入模型中?我想也许有办法以某种方式将自定义SQL附加到ORM生成的查询中,例如使用Meta:
class Measurement(models.Model):
...
class Meta:
append = "PARTITION BY RANGE (logdate)"
Run Code Online (Sandbox Code Playgroud)
就我而言,上述情况是不可能的.我也查看了架构库,但它没有使用新的PARTITION BY子句.相反,它使用继承和触发器,因此代码不会建议我可以附加该子句的任何方式(它也不会用于其他数据库,例如MySQL).
我也通过添加ALTER TABLE...操作来定制迁移,例如:
operations = [
migrations.RunSQL(
"ALTER TABLE measurement PARTITION BY RANGE (logdate)",
),
]
Run Code Online (Sandbox Code Playgroud)
不幸的是,PostgreSQL ALTER TABLE语句中似乎不支持上述(或类似)(至少尚未支持).
最后的想法是CREATE TABLE在发送查询之前检索Django模型生成的语句,例如模型sql = Measurement.get_statement() …