首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从MySQL 5.7迁移到MariaDB10.6的地方(SUBQUERY)后的缓慢查询

从MySQL 5.7迁移到MariaDB10.6的地方(SUBQUERY)后的缓慢查询
EN

Stack Overflow用户
提问于 2021-12-23 09:33:38
回答 1查看 479关注 0票数 0

我们希望将LAMP服务器从MySQL 5.7迁移到MariaDB 10.6。我们克隆了服务器,安装了MariaDB并迁移了数据库。我原以为SQL查询会有一些速度上的改进,但令我惊讶的是,我们的应用程序在使用MariaDB时速度更慢。我试图分析一些查询,我向您展示了一个特定的案例。

我们有这样一个查询:(a) SELECT .. FROM .. WHERE EXISTS (SELECT .. FROM .. WHERE outer_col=inner_col AND inner_where)

用MySQL 5.7: 0.1s。与MariaDB 10.6: 10

我试图按照建议的这里:(b) .. WHERE outer_col IN (SELECT inner_col FROM .. WHERE inner_where)更改查询

用MySQL 5.7: 0.1s。与MariaDB 10.6: 10

最后,我试图禁用物化optimizer_switch:SET SESSION optimizer_switch='materialization=off';的默认设置。

它起作用了!对于MariaDB,这两个查询现在都持续0.1s。

但是,为什么?这个优化器不应该是一个改进吗?你建议永久关闭它吗?我还有别的选择吗?

我也尝试过优化器exists_to_in。使用exists_to_in=off和materialization=on查询'b‘10s,查询'a’0.1s。

Thx

用MySQL 5.7 (FAST)分析计划

用MariaDB 10.6、materialization=on和exists_to_in=on (慢)分析计划

用MariaDB 10.6,materialization=off (FAST!)分析计划

用MariaDB 10.6,exists_to_in=off (FAST!)分析计划

创建具有相关行的sumar化表:

代码语言:javascript
复制
CREATE TABLE `GT_CalendariProfessional` (
    `CalendariProfessionalID` BIGINT(20) NOT NULL AUTO_INCREMENT,
    `ProfessionalId` INT(11) NOT NULL,
    `DataInici` DATETIME(6) NOT NULL,
    `DataFi` DATETIME(6) NOT NULL,
    `NecessitatId` INT(11) NULL DEFAULT NULL,
    PRIMARY KEY (`CalendariProfessionalID`) USING BTREE,
    INDEX `ix_professional` (`ProfessionalId`) USING BTREE,
    INDEX `ix_necessitat` (`NecessitatId`) USING BTREE,
    INDEX `ix_outerjoin_nec_dates` (`NecessitatId`, `DataInici`, `DataFi`) USING BTREE,
    INDEX `ix_outerjoin_prof_dates` (`ProfessionalId`, `DataInici`, `DataFi`) USING BTREE,
    INDEX `ix_IdIncidencia` (`IdIncidencia`) USING BTREE,
    CONSTRAINT `FK_GT_CalendariProfessional_GNR_Professionals` FOREIGN KEY (`ProfessionalId`) REFERENCES `GIRH_PROD`.`GNR_Professionals` (`ProfessionalID`) ON UPDATE NO ACTION ON DELETE NO ACTION,
    CONSTRAINT `FK_GT_CalendariProfessional_GT_Necessitat` FOREIGN KEY (`NecessitatId`) REFERENCES `GIRH_PROD`.`GT_Necessitat` (`NecessitatID`) ON UPDATE NO ACTION ON DELETE NO ACTION
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=6423951
;

SELECT COUNT(1) FROM GT_CalendariProfessional => 5413440行

EN

回答 1

Stack Overflow用户

发布于 2021-12-28 17:05:21

当您同时拥有INDEX(a)INDEX(a,b)时,放弃前者;它会分散优化器使用后者的注意力。有时,这会导致查询计划缓慢。(我看到有两宗这样的案件。)

我需要查看查询,以判断我的建议在您的情况下是否重要。(即使如此,我可能也不太确定。)不管怎么说,

代码语言:javascript
复制
INDEX `ix_professional` (`ProfessionalId`) USING BTREE,

会把优化者的注意力转移到

代码语言:javascript
复制
INDEX `ix_outerjoin_prof_dates` (`ProfessionalId`, `DataInici`, `DataFi`) USING BTREE,

这将是“一样好,也许更好”,但“可能稍慢”。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70460134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档