在条件联接中返回空值

时间:2019-02-08 22:39:42

标签: mysql performance join entity-attribute-value

我有一个$ for i in strcpy strlcpy strscpy; do man -w $i; done; /usr/share/man/man3/strcpy.3.gz /usr/share/man/man3/strlcpy.3bsd.gz No manual entry for strscpy 表和一个settings表,它们相互匹配每个用户的值。在未为用户启用设置的情况下,返回NULL值很重要。该表必须经常调用,因此高效也很重要。

最终,我有大约50个设置和数千个用户,因此,每次运行查询时,我应该得到50个类似于以下内容的结果:

settings_values

下面有一个有效的解决方案正在运行,但是它正在数据库请求中创建瓶颈,考虑到setting_id | setting_name | value | user_id 1 blue true 35 2 red NULL NULL 3 yellow false 35 4 brown true 35 5 black NULL NULL 只有50行,而settings只有大约20,000行,这很奇怪。

我的表的结构类似于:

settings_values

settings

使用setting_id作为唯一索引(主键)

setting_id | setting_name

settings_values

id | setting_id | value | user_id 是主键,id是对上表的前瞻性键引用,setting_id是varchar,而value上也有索引。 / p>

我当前的工作代码如下:

user_id

除了瓶颈,这似乎行得通(我得到了5行),并且我怀疑它的JOIN ON并导致速度变慢。我一直在尝试通过这样的JOIN ON WHERE达到相同的结果,但是我没有得到所需的NULL结果(即,它仅返回满足WHERE的3行):

SELECT
    s.setting_id,
    s.setting_name,
    sv.value,
    sv.user_id
FROM
    cmssps_settings s
LEFT JOIN cmssps_settings_values sv ON
    s.setting_id = sg.setting_id
    AND sv.user_id = '35';

当我同时解释两者时,都会得到前者的答案:

    SELECT
        s.setting_id,
        s.setting_name,
        sv.value,
        sv.user_id
    FROM
        cmssps_settings s
    LEFT JOIN cmssps_settings_values sv ON
        s.setting_id = sg.setting_id
        WHERE sv.user_id = '35';

当我为后者执行此操作时,我为我的第一个表获取了一个键值,我认为这表明执行速度更快:

id  | select_type   | table | type  | possible_keys | key   | key_len   | ref   | rows  | Extra
1   | SIMPLE        | s     | ALL   | [NULL]        | [NULL]| [NULL]    | [NULL]| 49    | [NULL]
1   | SIMPLE        | sv    | ref   | user_id       | branch_id | 5     | const | 24    | Using where

我也尝试过嵌套查询并使用UNION,但这似乎是一种回归。

为什么我的最初方法会对性能产生负面影响?

有没有更有效的方法来达到相同的结果?

0 个答案:

没有答案