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

时间:2013-08-31 17:25:25

标签: mysql sql performance select

我想从一个表中选择大约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_idtype_idobject_idpart_name列的唯一索引。

测量

我在桌子上填充了大约700k行并运行了三个查询(也是一个使用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秒。

1 个答案:

答案 0 :(得分:1)

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

然而,根据wildplasser的推荐:

  

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

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