0

我所有人,我有 2 个类似的非常大的表(每个 1M 行)具有相同的布局,我会将它们合并并按一个公共列排序: start 。我也会在“开始”中设置一个条件,即:开始> X。问题是视图不关心开始的索引并且复杂性上升很多,一个简单的查询大约需要 15 秒并且插入一个 LIMIT 并不能解决,因为结果首先被切断。

CREATE VIEW CDR AS
(SELECT start,    duration, clid, FROM cdr_md ORDER BY start LIMIT 1000) 
 UNION ALL 
 (SELECT start,       duration, clid, FROM cdr_1025 ORDER BY start LIMIT 1000) 
 ORDER BY start ;

查询:

SELECT * FROM CDR WHERE start>10

不返回预期结果导致 LIMIT 关键字事先切断结果。

预期的结果将是这样的查询:

CREATE VIEW CDR AS
(SELECT start,    duration, clid, FROM cdr_md WHERE start>X ORDER BY start LIMIT 1000) 
UNION ALL 
(SELECT start,    duration, clid, FROM cdr_1025 WHERE start>X ORDER BY start LIMIT 1000) 
 ORDER BY start ;

有没有办法避免这个问题?谢谢法布里齐奥

4

1 回答 1

0

我有 2 个类似的桌子......布局相同

这违背了正交设计原则

不要这样做。至少不是没有很好的理由——有了合适的索引,每张表 100 万条记录就足以让 MySQL 轻松处理,而无需任何分区;即使确实需要对数据进行分区,也有比这种手动混乱更好的方法(这可能会导致数据模棱两可、可能不一致,并导致数据操作代码的冗余和复杂性)。

相反,请考虑将您的表组合成一个具有合适列的表,以区分记录的差异。例如:

CREATE TABLE cdr_combined AS
  SELECT *, 'md'   AS orig FROM cdr_md
UNION ALL
  SELECT *, '1025' AS orig FROM cdr_1025
;

DROP TABLE cdr_md, cdr_1025;

如果您将始终沿以前的“分区”轴查看数据,请将可区分的列包括为索引前缀,与使用单独的表相比,性能通常会有所提高。

然后您不需要执行任何操作UNION,并且您的VIEW定义有效地变为:

CREATE VIEW CDR AS
SELECT start, duration, clid, FROM cdr_combined ORDER BY start

但是,请注意,对视图的查询可能并不总是像直接使用基础表那样执行。如Restrictions on Views 中所述

视图处理未优化:

  • 无法在视图上创建索引。

  • 索引可用于使用合并算法处理的视图。但是,使用 temptable 算法处理的视图无法利用其基础表上的索引(尽管可以在生成临时表期间使用索引)。

于 2013-07-18T11:23:22.070 回答