Mysql

隨機數字字元串作為主鍵 - 安全性、性能、效率?

  • December 12, 2015

我正在建構一個旨在儲存大量記錄(數百萬)的應用程序,並試圖找到一種最佳方式來儲存可從網路公開訪問的記錄標識符(記錄 URL)。

我想得到

  1. 隨機的、可能是唯一的、不可預測的 ID,相當短並且可以在 URL 中使用,這意味著 UUID 不適合,因為它太長了。
  2. 從數據庫獲得最佳性能並減少儲存空間。
  3. 避免創建自動遞增 id 的唯一目的是將其用作 PRIMARY 鍵。
  4. …避免未來的複制問題?

我的第一個想法是生成一個隨機字元串4r5psPxuRw,並將其用作主鍵(CHAR(10))。但在這種情況下,每條記錄的索引將是 30 字節,我假設大量記錄的 INSERT 性能會受到影響。

現在我得到一個隨機數字字元串,例如從 1 到 9 的 16 位數字,並將其儲存為 BIGINT(16)。

這是實現安全性、速度和減少代理密鑰數量的好方法嗎?我錯過了什麼嗎?

讓我總結一下您的問題並按照我的理解回答。

您希望防止外部方瀏覽您網站的每個頁面並保存有關您的使用者的資訊。

  1. 這正是搜尋引擎所做的。因此,您的使用者應該可以選擇將他們的資訊設置為公開/僅限朋友/私人。
  2. 要控制使用者(無論是誰)做什麼,您可以使用Session. 它允許您監控整體行為並查看自動化使用者。
  3. 當您有會話時,即使具有正確的 ID/URL,登錄使用者也無法訪問其他人的資訊。

你需要做什麼:

  1. 為您的網站定義“使用者”角色,包括搜尋引擎、API、廣告代理等自動化使用者。
  2. 為自己描述適當的使用模式,使用者需要什麼樣的資訊,多久,身份驗證,授權,訪問各種內容的方法。
  3. 找到適當的解決方案來實現上述內容。

您需要將 ID 從一個網頁傳遞到“下一個”嗎?但是 HTTP 是無狀態的?而且您不想在 URL 中公開該 ID?

然後使用 cookie 傳遞它。這就是所有重量級選手的做法。想想購物網站是如何運作的。

ID(在 cookie 中)可能是數據庫表中用於查找所有其他資訊的查找鍵。其中一些資訊用於驗證 ID 是否用於“目前會話”,而不是昨天的會話。也就是說,它不僅僅是“user_id”。

UUID 作為鍵(PRIMARY 或其他)對性能很不利。盡可能避免使用它們。這適用於您的“短”uuid。

“記錄可公開訪問的標識符”——你是什麼意思?URL 是可見的,句點。

引用自:https://dba.stackexchange.com/questions/122915