優化迴圈 Query DB,如何提前確保 generated token unique

建立一筆訂單時,我們會給予一串 serial number,作為訂單唯一識別。我們會寫出如下的代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# app/models/model_name.rb
class ModelName < ActiveRecord::Base
include Tokenable
end

# app/models/concerns/tokenable.rb
module Tokenable
extend ActiveSupport::Concern

included do
before_create :generate_token
end

protected

def generate_token
self.token = loop do
random_token = SecureRandom.urlsafe_base64(nil, false)
break random_token unless self.class.exists?(token: random_token)
end
end
end

Query 是使用搜尋效益較高的 exists

[Mysql] Mysql Incorrect string value problem

1
Mysql Incorrect string value '\xE7\xA8\x8B\xE5\xBA\x8F...' for column 'course' at row 1

同:Mysql 插入中文错误:Incorrect string value: ‘\xE7\xA8\x8B\xE5\xBA\x8F…’ for column ‘course’ at row 1

解決方式

如果資料庫已經創建,則先刪除。

1
2
mysql> show databases;
mysql> drop database wrong_database;

再重新創建,並以 utf8mb4 為預設

1
mysql> CREATE DATABASE test_database CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

[Mysql] 降版或使用 Mariadb

當一開始使用 brew install mysql 你就悲劇了
會下載最新版並開始安裝
以下指令得知當前下載哪一最新版本:

1
2
3
$ brew info mysql
>> mysql: stable 8.0.19 (bottled)
>> ....

降版的不歸路上有一種「壞路不能走的體悟」

從數十億垃圾郵件列表中,判斷某邮箱是否為垃圾邮箱

在很多場景上,常需要判斷 A 是否在此集合裡面。

「某 A 郵箱,判斷是否在數十億垃圾郵箱列表中,來達到防止垃圾郵箱的訪問、註冊等等。」

如果我們在查找數據庫之前有做數據緩存,像是 redis 緩存之類的,假設黑客惡意大量訪問、發起大量請求。

不僅會造成緩存掛掉,還有數據庫掛掉

那就是知名的穿庫、緩存穿透問題。

什麼是建立索引?

某次和朋友描述建立索引,覺得自己講得很模糊,決定做一份筆記。

在資料庫當中

  • 為了改進查詢效率,在資料量大的時候,可以透過建立索引讓資料庫加速查詢效率。
  • 如果沒有對資料表建立索引,將會使用 Full table scan (sequential scans) 來查詢資料。

建立索引

  • 簡單來說:『 一個數據庫中的索引就是一本書的目錄。』
  • 原理來說:『 額外在硬碟建立一張索引表,當作目錄,當進行資料庫查詢時,針對查詢條件在索引表尋找相對應的索引。再透過此索引指向實體資料。假如查詢條件不在索引表裡,就會對整個表做循序查詢。』
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×