2010-11-04 47 views
0

我讀了大量有關數據庫的btree定理的文章。這裏總是讓人迷惑不解。
假設我有一個表被描述爲如下:
表userinfo的:
(USER_ID作爲主鍵,用戶名字符串,密碼作爲字符串)
如在一些文章所描述的,USER_ID創建爲索引爲表用戶信息,我會得到有效的性能與特點,如果我由USER_ID .. 的指數選擇記錄,但如果我通過用戶名選擇,它說,它campares行一個通過e ..... 我試試MYSQL,它不如預期的那麼慢....
爲什麼?
mysql怎麼用這個選擇? thanx有關btree和數據庫索引的問題

+1

它不使用索引,而是確實掃描每一行。但是任何體面的數據庫都會嘗試優化掃描。 _「不如預期的那麼慢」_與用索引「_不如索引速度一樣快」_,但在非索引列上選擇可以有效且快速_enough_。 – Wrikken 2010-11-04 16:25:35

+0

@Wrikken:thanx for you即時回覆..如何解決這個選擇用戶名的問題,你知道任何表都不一定只有一列。 – 2010-11-04 16:35:50

+0

列的寬度通常是已知的,因此在特定的字節偏移處掃描特定的列通常是非常有效的(並且如果第一個字節不匹配丟棄該行等)。不同的數據庫可能採用不同的策略。如果你真的想知道,'mysql'的來源是免費的,所以瀏覽它,你的休閒。甲骨文可能採用了很多相同的策略。我自己非常滿意,知道如何使用它作爲最終用戶,不需要在這裏瞭解實現的細節:) – Wrikken 2010-11-04 16:54:48

回答

0

如果您的WHERE子句通過用戶名(未索引)進行比較,則可能會執行全表掃描。但是,如果表中的行數很少,這可能仍然很快。現在計算機速度非常快,數據庫在組織數據以進行有效的表掃描方面非常聰明。

+0

thanx ...正如你所說,它會掃描所有行以匹配非索引條件,但如果我有數十億條記錄,並且用戶名字段沒有按字母順序插入。後續掃描可能耗時,有沒有辦法獲得高性能......? thanx – 2010-11-04 16:38:55

+0

如果您打算在一列上比較並且有多行,請考慮添加一個索引。 – 2010-11-04 16:44:17