这一招能让 MariaDB 提速 30 倍!

是的,这标题有点“标题党”,但在本例中,运行一条 SQL 命令确实让社区用户的性能提高了这么多。这也能帮助你。
故事
一位社区用户在几个地方发帖称,将大型 WordPress 安装迁移到 MariaDB 时,发现某个查询性能极差。该查询执行耗时 1.5 秒,从执行计划(explain plan)中可以清楚地看出,优化器在决定连接顺序时没有做出理想的判断。
该查询是由 WordPress 生成的,因此不容易强制使用索引或重写查询。
解决方案
我建议用户在所有相关表上运行这条命令
ANALYZE TABLE tbl PERSISTENT FOR ALL;
用户执行后,效果让他们惊叹不已。查询执行时间突然降至 0.05 秒。
原因
速度慢的原因是优化器对数据本身一无所知。它不得不对数据的分布进行假设,但不幸的是这些假设是错误的。
“ANALYZE TABLE” 命令会生成并存储数据的直方图。这使得优化器能够更好地估计索引中值的频率,从而对连接顺序和过滤做出更好的决策。
要了解更多信息,你可以观看关于此主题的MariaDB Server Fest 2021 录像。还有一个知识库文章描述了它是如何提供帮助的,另一篇文章描述了“ANALYZE TABLE” 命令的使用方法。
PERSISTENT FOR ALL 部分是做什么用的?我在手册里甚至找不到这个。
你好 Jan,
普通的“ANALYZE TABLE” 命令如果存储引擎支持,会由存储引擎生成自己的统计信息。而使用“PERSISTENT FOR”,统计信息会在存储引擎外部生成(并持久化到 mysql.%_stats 表中)。详情请看这里
https://mariadb.com/kb/en/engine-independent-table-statistics/#collecting-statistics-for-specific-columns-or-indexes