我有一个数据库设计,该数据库具有用于单独的客户数据的单独的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)?
答案 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);