我是SQL新手,我有一個關於性能的基本問題。性能的SQL設計
我想創建一個將存儲有關我的用戶信息的用戶數據庫:在名稱
- 編號
- 登錄
- 密碼
- 真實姓名
後來我想在以下位置執行SELECT
查詢:Id,登錄名和真實姓名。
什麼是這個數據庫的最佳設計,我應該創建什麼表和什麼鍵?
我是SQL新手,我有一個關於性能的基本問題。性能的SQL設計
我想創建一個將存儲有關我的用戶信息的用戶數據庫:在名稱
後來我想在以下位置執行SELECT
查詢:Id,登錄名和真實姓名。
什麼是這個數據庫的最佳設計,我應該創建什麼表和什麼鍵?
如果只是關於這四個字段,它看起來就像一張表。主鍵ID
,唯一索引LoginName
。你可能不想存儲密碼,但只是一個散列。
根據您的查詢,創建不同的索引。此外,您可能根本不需要ID
字段。
更新: 在某些列上創建索引可使數據庫優化其SQL語句。鑑於你的用戶表:
USER
USER_ID BIGINT NOT NULL
LOGIN_ID VARCHAR(<size>) NOT NULL
PASSWORD VARCHAR(<size>) NOT NULL
NAME VARCHAR(<size>) NOT NULL
CONSTRAINT PK_USER PRIMARY KEY (USER_ID)
我知道會自動創建主鍵索引,這實際上意味着數據庫維護一個優化的查找表中的數據庫,請參見WikiPedia進一步的細節。
現在說,你想LOGIN_ID
查詢用戶這是一個相當常見的情況,我想,你可以創建另一個指標,如:
CREATE INDEX I_USER_1 ON USER (LOGIN_ID asc)
上述指數將優化select * from USER where LOGIN_ID='foo'
。此外,你可以創建一個唯一索引替代,假設你不想重複LOGIN_ID
S:
CREATE UNIQUE INDEX UI_USER_1 ON USER (LOGIN_ID asc)
所以如果你想以優化用戶的真實姓名(NAME
)查詢這就是整個故事,你剛剛創建另一個指標:
CREATE INDEX I_USER_2 ON USER (NAME asc)
對「真實姓名」的查詢如何?你可以告訴我,當我登錄登錄名時,幕後發生了什麼? SQL在做什麼? – 2012-01-04 07:05:48
只需添加到@homes回答您應該制定出什麼樣的,你會運行查詢,然後優化那些五花八門的查詢。例如,如果您正在進行大量寫操作,並且沒有多次讀取大量索引會導致性能問題。這有點像調整一輛汽車的發動機,你是否要快速沿着阻力帶行駛,或者你是否在調整長距離駕駛。
無論如何,你還問了關於NAME專欄。如果你要在一個varchar列上進行匹配,可能值得研究FULLTEXT索引的使用。
http://msdn.microsoft.com/en-us/library/ms187317.aspx
這允許你做,你可能會匹配名稱等的部件名稱優化searchs。正如@ homes的回答所說,它確實取決於你在查詢時的查詢和意圖。
值得一提的是,在SQL管理工作室等查詢中使用查詢執行計劃來查看索引對行數和查詢順序的影響。
http://www.sql-server-performance.com/2006/query-execution-plan-analysis/
引用另一個答案時,最好鏈接到它(比如說「@homes答案」),而不是參考「上面的答案」。答案可以相對於彼此移動,另一個答案可能會出現在你的上方等。 – 2012-01-04 10:45:16
我覺得你有種打它 - 關鍵是ID(它會自動爲指數),再加入上的登錄名和真實姓名索引。你可能要做的一件事是將真名打破姓氏和名字。 – Prescott 2012-01-04 06:57:06