1

我想使用构成唯一索引的四列从表中选择大约 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_id和都是ns_id外键。

只有一个索引,即包含、w_id和列的唯一索引。type_idobject_idpart_name

测量

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

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

INRaymond 关于使用 an可能导致全表扫描的假设得到了证明。但是,结果显示ORUNION显示的时间差不多。

同样让我担心的是,这些结果只是在碎片整理之后才实现的。在碎片整理之前,即使是解决方案OR也需要大约 0.3 秒。

4

1 回答 1

1

选择 using=AND/比结合使用 row 构造函数更快OR。强制进行全表扫描,这使其比其他解决方案慢几倍。UNION ALLININ

但是,根据 wildplasser 的建议:

“对 UNION 和/或 AND/OR 子句的需求通常是次优数据模型的结果”

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

于 2013-09-05T13:40:58.420 回答