2010-02-06 89 views
0

所以我有一個獨特的CHAR(255)列,我想找到一個特定的行,MySQL搜索長CHAR列,使用較小(substring)CHAR列作爲索引?

創建CHAR(10)INDEX使搜索更有效嗎? 我知道唯一的也是指數

發動機將掃描throught索引到的第一個字母爲J,然後JO,然後JOH 但255個字節×100萬條記錄的索引,是大量的內存「空間」 掃描,而不只是10字節×百萬

mail_sub = LEFT(郵件,10)
mail_sub = SUBSTR(郵件,10)

`CREATE TABLE pwd( 
    id  INT, 
    mail_sub CHAR(10) NOT NULL, 
    mail  CHAR(255) NOT NULL, 
    pw_hash CHAR(32) NOT NULL, 
PRIMARY KEY (id), 
UNIQUE KEY ind_email (mail), 
INDEX  rv_sub (mail_sub,id) 
) ENGINE = INNODB CHARACTER SET latin1;` 

(ID不是AUTO_INCREMENT,其在插入之前定義)

該表讀取多達
SELECT * FROM pwd WHERE email='[email protected]';

SELECT * FROM pwd WHERE id=12345;

因此,「ID」或「郵件」可能是主鍵,我真的不看任何區別;

我的問題是,像

`SELECT * FROM pwd WHERE mail_sub='abcde12345' AND 
email='[email protected]';` 

將讓搜索更有效?

優化使用「ind_email」
FORCE /忽略指數堅稱沒有用,根據文檔的MySQL索引提示會被忽略的字符串類型(http://dev.mysql.com/doc/refman/5.1/en/index-hints.html

我想使用JOIN來進行搜索上mail_sub首先,但沒有成功

`EXPLAIN EXTENDED 
SELECT a.pw_hash FROM pwd as a 
JOIN pwd as b ON b.id=a.id 
WHERE a.mail_sub='abcde12345' AND b.mail='abc...john.com';` 

你對此有何看法?

謝謝!

回答

0

添加一列散列的電子郵件地址。然後用作謂詞where a.hash = hash('[email protected]') and a.email = '[email protected]'

碰巧,mysql包含一個散列函數,稱爲password(),它產生16個字節的散列。

+0

感謝您的建議----- 是的,我雖然使用MD5()這是16字節(32十六進制),密碼()實際上是20字節(40十六進制字符)-----但可以我只在謂詞中使用散列? ---你寫了'和a.email ='foo @ bar.com'',所以我認爲我們不能相信散列是唯一的,雖然MySQL在INSERTion期間確保唯一性,但我最終可能會告訴用戶一封電子郵件地址已經註冊,什麼時候沒有,還是我太偏執? – Luxvero 2010-02-07 00:58:53

+0

另外,當我嘗試它早些時候使用'where a.hash = hash('[email protected]')和a.email ='foo @ bar.com'' mysql繼續使用'email'索引----或者你建議使用哈希列不是唯一的,只是和索引,因此「郵件= xxx」來篩選匹配索引的行?並忘記通過SQL約束強制實施郵件是唯一的? – Luxvero 2010-02-07 01:07:06