[英]JOIN on primary key (INT), WHERE by alphanumeric UID (VARCHAR)… Is it optimal?
目标是改变这个 URL...
app.com/journals/3/items
进入
app.com/journals/aWNtFJXeYuvyhyJpqAjW/items
...我想知道这是否是最佳方法,即加入 id,按 uid 搜索。
SELECT
ji.*,
j.uid journalUid
FROM journalItems ji
LEFT JOIN journal j ON j.id = ji.journalId
WHERE
j.uid = 'aWNtFJXeYuvyhyJpqAjW'
journal
+----+----------------------+--------+
| id | uid VARCHAR(20) | name |
+----+----------------------+--------+
| 1 | cerGJ8cMKMK2njBtgsMy | foo |
| 2 | aWNtFJXeYuvyhyJpqAjW | bar | <------- journal
| 3 | 7zwACt4fHkEchSjeeW7j | baz |
+----+----------------------+--------+
journalItems
+----+----------------------+--------+-----------+
| id | uid VARCHAR(20) | name | journalId |
+----+----------------------+--------+-----------+
| 1 | ncv3VTlOMls6RPejJsjq | a | 1 |
| 2 | NPz9CKEk7w14fKqIkCI2 | b | 1 |
| 3 | jghhnU29IKoOoG4smM4W | c | 1 |
| 4 | YE1nFNzjnusuyZeMNFWF | d | 2 | <------- item
| 5 | 5N15UTgDgRjRKwt3yUCC | e | 2 | <------- item
| 6 | 0eTBq3Ptzjbw32LkAQ0j | f | 3 |
+----+----------------------+--------+-----------+
这是 UID 生成器:
function generateUid() {
let length = 20;
let uid = "";
let characters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
for (let i = 0; i < length; i++) {
uid += characters[Math.floor(Math.random() * characters.length)];
}
return uid;
}
您的where
子句正在撤消left join
,因此您不妨使用常规join
:
SELECT ji.*, j.uid as journalUid
FROM journalItems ji JOIN
journal j
ON j.id = ji.journalId
WHERE j.uid = 'aWNtFJXeYuvyhyJpqAjW';
为了提高性能,您需要journalItems(journalId)
和journal(uid, id)
上的索引。
否则,您的查询很好,尽管当您只选择其中一个时,您希望将j.uid
放入结果集中似乎很奇怪。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.