我有一个$ 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,但这似乎是一种回归。
为什么我的最初方法会对性能产生负面影响?
有没有更有效的方法来达到相同的结果?