我想使用构成唯一索引的四列从表中选择大约 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_id
object_id
part_name
测量
我用大约 700k 行填充了表并运行了三个查询(也是一个 using UNION
)。我总是查询相同的行。这些是结果:
Solution Time [s] EXPLAIN
with OR 0.0003 ref
with IN 0.4546 ALL
UNION 0.0004 const
IN
Raymond 关于使用 an可能导致全表扫描的假设得到了证明。但是,结果显示OR
和UNION
显示的时间差不多。
同样让我担心的是,这些结果只是在碎片整理之后才实现的。在碎片整理之前,即使是解决方案OR
也需要大约 0.3 秒。