gpt4 book ai didi

mysql - 通过具有良好性能的唯一列选择多行

转载 作者:行者123 更新时间:2023-11-29 00:26:46 24 4
gpt4 key购买 nike

我想使用构成唯一索引的四列从表中选择大约 20 到 100 行。

我想出的第一个方法是使用 OR :

SELECT ...
WHERE (w_id = ? AND type_id = ? AND object_id = ? AND part_name = ?)
OR (w_id = ? AND type_id = ? AND object_id = ? AND part_name = ?)
OR [...]

我还看到了使用行构造函数的解决方案:

SELECT ...
WHERE (w_id, type_id, object_id, part_name) IN ((1,2,3,''),(1,2,4,''), [...])

但是,据说这在选择多行时性能不佳。

哪种解决方案性能更好,或者我应该使用其他解决方案(例如拆分查询)?

提前致谢!

表结构

CREATE TABLE page(
page_id PRIMARY KEY AUTO_INCREMENT,
w_id INTEGER NOT NULL,
ns_id INTEGER NOT NULL,
type_id INTEGER NOT NULL,
object_id INTEGER NOT NULL,
part_name VARCHAR(20) NOT NULL,
);

两者都是 w_idns_id是外键。

只有一个索引,即包含w_id列的唯一索引, type_id , object_idpart_name .

测量

我用大约 70 万行填充了表并运行了三个查询(也是一个使用 UNION 的查询)。我总是查询相同的行。这些是结果:

Solution  Time [s]  EXPLAIN
with OR 0.0003 ref
with IN 0.4546 ALL
UNION 0.0004 const

Raymond 的假设是使用 IN可能会导致全表扫描被证明。然而,结果显示 ORUNION显示完全相同的时间。

同样让我担心的是,这些结果是在进行碎片整理后才获得的。在碎片整理之前甚至是 OR 的解决方案大约需要 0.3 秒。

最佳答案

使用 =ANDOR/UNION ALL 选择比使用 IN 与行构造函数结合使用。 IN 强制进行全表扫描,这使其比其他解决方案慢几倍。

不过,在wildplasser的推荐下:

"the need for UNION and/or AND/OR clauses are often the result of a sub-optimal data model"

我将更改我的数据库模型,因此无需以这种方式选择行,而是使用连接。

关于mysql - 通过具有良好性能的唯一列选择多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18550858/

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