gpt4 book ai didi

mysql - WHERE 子句中的两个 "="比较查询速度下降

转载 作者:行者123 更新时间:2023-11-30 21:52:18 25 4
gpt4 key购买 nike

我有一个音乐数据库,其中包含发行表和发行标题。此“releases_view”获取轨道的标题/title_id 和替代标题/替代title_id。这是 View 的代码:

SELECT
t1.`title` AS title,
t1.`id` AS title_id,
t2.`title` AS title_alt,
t2.`id` AS title_alt_id

FROM
releases

LEFT JOIN titles t1 ON t1.`id`=`releases`.`title_id`
LEFT JOIN titles t2 ON t2.`id`=`releases`.`title_alt_id`

连接表中的title_idtitle_alt_id字段都是int(11)titletitle_alt 是 varchars。

问题

此查询将花费不到 1 毫秒:

SELECT * FROM `releases_view` WHERE title_id=12345

此查询也将花费不到 1 毫秒:

SELECT * FROM `releases_view` WHERE title_id=12345 OR title_alt_id!=54321

但是这个查询需要 0.2 秒。 慢了 200 倍!

SELECT * FROM `releases_view` WHERE title_id=20956 OR title_alt_id=38849

一旦我在 WHERE 子句中使用“=”进行两次比较,事情就会变得很慢(尽管所有查询只有几个结果)。

你能帮我理解发生了什么吗?

编辑

'EXPLAIN' 为 title_alt_id 显示了 USING WHERE,但我不明白为什么。我怎样才能避免这种情况?

** 编辑 **这是 EXPLAIN DUMP。

id  select_type     table       partitions  type    possible_keys   key     key_len ref                         rows    Extra 
1 SIMPLE releases NULL ALL NULL NULL NULL NULL 76802 Using temporary; Using filesort
1 SIMPLE t1 NULL eq_ref PRIMARY PRIMARY 4 db.releases.title_id 1
1 SIMPLE t2 NULL eq_ref PRIMARY PRIMARY 4 db.releases.title_alt_id 1 Using where

最佳答案

“真的很慢”是因为优化器不能很好地使用OR

(优化器的)计划 A:扫描整个表,评估整个 OR

B 计划:“索引合并联盟”可用于 title_id = 20956 OR title_alt_id = 38849 if title_id 中有单独的索引和 title_alt_id:使用每个索引获取两个 PRIMARY KEYs 列表并“合并”列表,然后进入表以获取 *。多步骤,不便宜。所以很少使用 B 计划。

title_id = 12345 OR title_alt_id != 54321 是个谜,因为它应该返回表的大部分内容。请提供 EXPLAIN SELECT...

LEFT JOIN(与 JOIN 相对)需要假定“右”表中可能缺少该行。

关于mysql - WHERE 子句中的两个 "="比较查询速度下降,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46707495/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com