(太多)导致问题的视图

Posted

技术标签:

【中文标题】(太多)导致问题的视图【英文标题】:(Too) many views causing problems 【发布时间】:2019-10-22 06:54:39 【问题描述】:

我有一个使用 php 和 MariaDB 10.3 的大型数据库应用程序。

我有大约 100 个表,然后有大约 3,000 个视图。

当超过 1,000 个视图时,数据库架构会崩溃并停止访问。桌子仍然很好,但所有的观点都崩溃了。当查询任何视图时,它会给出不同的错误消息,例如“需要重新准备准备好的语句”或“丢失连接”。

主要问题不在于表缓存,因为扩展它并不能解决问题。它也不是关于如何模拟准备好的语句。我已经尝试过这些策略。

有人知道这个问题以及如何解决它?

【问题讨论】:

How to get rid of mysql error 'Prepared statement needs to be re-prepared'的可能重复 这并不能解决这个问题 - 甚至其中一条错误消息都是一样的。 副本表明原因可能来自:1) 错误,2) 配置,3) 实际需要重新准备查询,4) 托管。我们不能完全解决这个问题,因为它相当广泛.. 虽然我不能特别代表 MariaDB,但我会观察到 MySQL 中的视图提供的好处非常有限,因为它们无法利用底层索引。此外,100 个表是相当多的 - 可能大到足以表明设计不佳。 100 个表对于大型综合应用程序来说并不算多。专业系统很容易拥有数千个。 InnoDB 有 40 亿个表的限制。但同样,问题不在于表格,而在于视图。如果您不“强制” MariaDB 创建临时表,MariaDB 中的视图可以利用底层索引。这其实也是view数量多的原因,view上的view很容易造成这种情况。 【参考方案1】:

查看max_prepared_stmt_count的值,默认是16K左右,所以我觉得不是问题。

当你完成一个声明时你会DEALLOCATE PREPARED STATEMENT吗?

VIEWs 是否调用存储例程?

您是否打开了查询缓存?

table_open_cache 的值是多少?

SHOW GLOBAL STATUS LIKE 'Subquery_cache%';

【讨论】:

许多好的建议 :-) 增加表打开缓存是我所做的并且解决了它:-)

以上是关于(太多)导致问题的视图的主要内容,如果未能解决你的问题,请参考以下文章

带有集群和自定义视图标记的谷歌地图在放大和缩小时滞后太多

MySQL视图花费太多时间来选择数据

多个视图的单个相机视图

echarts 柱状图由于数据太多导致数组柱重叠

ClickhouseClckhouse 视图 可以插入 但是查询不到

在视图中使用视图会导致崩溃?