查询优化(多个联接)

问题描述 投票:0回答:2

我想找到一种改进查询的方法,但看来我已经完成了所有工作。让我给你一些细节。

以下是我的查询:

SELECT 
    `u`.`id` AS `id`,
    `p`.`lastname` AS `lastname`,
    `p`.`firstname` AS `firstname`,
    COALESCE(`r`.`value`, 0) AS `rvalue`,
    SUM(`rat`.`category` = 'A') AS `count_a`,
    SUM(`rat`.`category` = 'B') AS `count_b`,
    SUM(`rat`.`category` = 'C') AS `count_c`
FROM
    `user` `u`
    JOIN `user_customer` `uc` ON (`u`.`id` = `uc`.`user_id`)
    JOIN `profile` `p` ON (`p`.`id` = `u`.`profile_id`)
    JOIN `ad` FORCE INDEX (fk_ad_customer_idx) ON (`uc`.`customer_id` = `ad`.`customer_id`)
    JOIN `ac` ON (`ac`.`id` = `ad`.`ac_id`)
    JOIN `a` ON (`a`.`id` = `ac`.`a_id`)
    JOIN `rat` ON (`rat`.`code` = `a`.`rat_code`)
    LEFT JOIN `r` ON (`r`.`id` = `u`.`r_id`)
GROUP BY `u`.`id`
;

注意:某些表名和列名被自动隐藏。

现在让我给您一些体积数据:

user => 6534 rows
user_customer => 12 923 rows
profile => 6511 rows
ad => 320 868 rows
ac => 4505 rows
a => 536 rows
rat => 6 rows
r => 3400 rows

最后,我的执行计划:

enter image description here

我的查询当前确实在大约1.3到1.7秒内运行,这足够慢,足以使我的应用程序的用户烦恼...而且fyi结果集由165行组成。

我有办法改善这一点吗?

谢谢。

编辑1(下面是对Rick James的回答):不使用FORCE INDEX时的速度和说明是什么?

令人惊讶的是,当我不使用FORCE INDEX时,它会变得更快。老实说,我真的不记得为什么要进行这种更改。在进行各种尝试之一后,我可能发现它在性能方面有更好的结果,此后一直没有删除它。

[当我不使用强制索引时,它使用另一个索引ad_customer_ac_id_blocked_idx(customer_id,ac_id,已阻止),时间约为1.1秒。我不太了解,因为当我们谈论customer_id的索引时,fk_ad_customer_idx(customer_id)是相同的。

我想找到一种改进查询的方法,但看来我已经完成了所有工作。让我给你一些细节。下面是我的查询:选择`u`.id` AS`id`,`p`.`lastname` AS`lastname`,`p` ....

mysql mariadb query-performance
2个回答
0
投票

首先,您不需要查询中的tickeveryTableAndColumn,也不需要结果列,别名等。tick标记主要用于与保留作品冲突的情况,因此解析器知道您所指的是特定的列...就像具有一个名为“ JOIN”的COLUMN的表一样,但是JOIN是SQL命令的一部分...请参阅将引起的混乱。也有助于提高可读性。


0
投票

摆脱FORCE INDEX。即使昨天有所帮助;明天可能会受伤。

© www.soinside.com 2019 - 2024. All rights reserved.