UNION ALL和许多数据库的派生表中的索引用法

时间:2019-01-26 18:12:35

标签: mysql sql database mariadb

我有一个数据库设计,该数据库具有用于单独的客户数据的单独的DB。该数据库具有一个数据表,该表现在一个月内包含约400万行。

对于查询,我创建了将客户ID映射到特定数据库的自定义视图。视图如下:

CREATE ALGORITHM = MERGE VIEW DataView AS

SELECT
  100 AS CustomerID,
  c1db.Data.*
FROM
  Customer100_DB c1db

UNION ALL

SELECT
  101 AS CustomerID,
  c2db.Data.*
FROM
  Customer101_DB c2db;

现在我的查询通常如下:

  SELECT COUNT(*) FROM DataView WHERE CustomerID = ... AND ....;

我的问题是,查询视图包含至少2个数据库后,将不使用数据表中的相应索引。 即从视图中删除[UNION ALL SELECT ... [...]]时,它使用索引优良,或者直接查询数据表时。 在这里是否存在设计问题,或者我有什么办法让优化程序有一个更好的机会来降低索引(使用MariaDB 10.3)?

2 个答案:

答案 0 :(得分:0)

尽管索引和视图越来越好,但它们在MySQL / MariaDB中却不能很好地工作。

我建议您将所有数据合并到一个表中。如果大多数查询都在一个客户上,则可以按客户对数据进行分区。

将数据放在单个表中,就可以使用索引。

答案 1 :(得分:0)

您可以尝试使用索引提示: https://dev.mysql.com/doc/refman/8.0/en/index-hints.html 因此,您的语法可能是:

CREATE ALGORITHM = MERGE VIEW DataView AS
SELECT
100 AS CustomerID,
c1db.Data.*
FROM
Customer100_DB c1db USE INDEX (col1_index,col2_index)
UNION ALL
SELECT
101 AS CustomerID,
 c2db.Data.*
FROM
Customer101_DB c2db USE INDEX (col1_index,col2_index);