繁体   English   中英

在主键 (INT) 上加入,通过字母数字 UID (VARCHAR) 在哪里......它是最佳的吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM