【发布时间】:2020-04-30 22:48:33
【问题描述】:
我想找到一种改进查询的方法,但似乎我已经完成了这一切。让我给你一些细节。
以下是我的查询:
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
最后,我的执行计划:
我的查询当前运行时间大约为 1.3 到 1.7 秒,这当然慢到足以惹恼我的应用程序的用户......另外,结果集由 165 行组成。
有什么办法可以改进吗?
谢谢。
编辑 1(下面对 Rick James 的回答): 不使用 FORCE INDEX 时的速度和 EXPLAIN 是多少?
令人惊讶的是,当我不使用 FORCE INDEX 时它会变得更快。老实说,我真的不记得为什么我做了那个改变。在我的各种尝试中,我可能在性能方面发现了更好的结果,并且从那以后就没有删除它。
当我不使用 FORCE INDEX 时,它使用另一个索引 ad_customer_ac_id_blocked_idx(customer_id, ac_id, blocked) 并且时间约为 1.1 秒。 我真的不明白,因为当我们谈论 customer_id 上的索引时,fk_ad_customer_idx(customer_id) 是一样的。
【问题讨论】:
-
您可以检查您的数据库设计以确保数据不会低效混乱。如果没有,别担心,我认为现在是数据检索的好时机。
-
1.3 秒内返回多少行?
-
不使用
FORCE INDEX时的速度和EXPLAIN是多少? -
Mmmh 乍一看似乎是一个相当简单的查询...您是否尝试调整引擎? (加入)缓冲区、内存分配等?
-
你已经证明了为什么
FORCE INDEX通常是个坏主意。
标签: mysql mariadb query-performance