所以我有一個獨特的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';`
你對此有何看法?
謝謝!
感謝您的建議----- 是的,我雖然使用MD5()這是16字節(32十六進制),密碼()實際上是20字節(40十六進制字符)-----但可以我只在謂詞中使用散列? ---你寫了'和a.email ='foo @ bar.com'',所以我認爲我們不能相信散列是唯一的,雖然MySQL在INSERTion期間確保唯一性,但我最終可能會告訴用戶一封電子郵件地址已經註冊,什麼時候沒有,還是我太偏執? – Luxvero 2010-02-07 00:58:53
另外,當我嘗試它早些時候使用'where a.hash = hash('[email protected]')和a.email ='foo @ bar.com'' mysql繼續使用'email'索引----或者你建議使用哈希列不是唯一的,只是和索引,因此「郵件= xxx」來篩選匹配索引的行?並忘記通過SQL約束強制實施郵件是唯一的? – Luxvero 2010-02-07 01:07:06