MySQL面试题讲解之如何设置Hash索引 |
闄や簡B-Tree 绱㈠紩锛孧ySQL杩樻彁渚涗簡濡備笅绱㈠紩锛?/p>
鍙湁Memory寮曟搸鏀寔锛屽満鏅畝鍗?/p>
MyISAM鐨勪竴涓壒娈婄储寮曠被鍨嬶紝涓昏鐢ㄤ簬鍦扮悊绌洪棿鏁版嵁绫诲瀷
MyISAM鐨勪竴涓壒娈婄储寮曪紝涓昏鐢ㄤ簬鍏ㄦ枃绱㈠紩锛屼粠MySQL 5.6寮濮婭nnoDB鏀寔鍏ㄦ枃绱㈠紩 绱㈠紩 / 瀛樺偍寮曟搸MyISAMInnoDBMemoryB-Tree绱㈠紩鏀寔鏀寔鏀寔HASH绱㈠紩涓嶆敮鎸佷笉鏀寔鏀寔R-Tree绱㈠紩鏀寔鏀寔涓嶆敮鎸丗ull-text绱㈠紩鏀寔鏀寔涓嶆敮鎸?/p> 鏈甯哥敤鐨勭储寮曚篃灏辨槸B-tree绱㈠紩鍜孒ash绱㈠紩锛屼笖鍙湁Memory锛?NDB涓ょ寮曟搸鏀寔Hash绱㈠紩銆?Hash绱㈠紩閫備簬key-value鏌ヨ锛岄氳繃Hash绱㈠紩姣擝-tree绱㈠紩鏌ヨ鏇村姞杩呴熴備絾Hash绱㈠紩涓嶆敮鎸佽寖鍥存煡鎵句緥濡?lt;><==,>==绛夈?Memory鍙湁鍦?="鐨勬潯浠朵笅鎵嶄細浣跨敤hash绱㈠紩 MySQL鍦?8.0鎵嶆敮鎸佸嚱鏁扮储寮曪紝鍦ㄦ涔嬪墠鍙兘瀵瑰垪鐨勫墠闈㈡煇涓閮ㄥ垎杩涜绱㈠紩锛屼緥濡傛爣棰榯itle瀛楁锛屽彲浠ュ彧鍙杢itle鐨勫墠10涓瓧绗︾储寮曪紝杩欐牱鐨勭壒鎬уぇ澶х缉灏忎簡绱㈠紩鏂囦欢鐨勫ぇ灏忥紝浣嗗墠缂绱㈠紩涔熸湁缂虹偣锛屽湪order by鍜実roup by鎿嶄綔鏃跺け鏁堛?/p> create index idx_title on film(title(10)); 1 鐗圭偣鍙瓨鍦ㄦ暟缁勶紝鐢ㄤ竴涓猦ash鍑芥暟鎶妅ey杞崲鎴愪竴涓‘瀹氱殑鍐呭瓨浣嶇疆锛岀劧鍚庢妸value鏀惧湪鏁扮粍鐨勮浣嶇疆銆備娇鐢?hash 鑷劧浼氭湁鍝堝笇鍐茬獊鍙兘锛孧ySQL 閲囧彇鎷夐摼娉曡В鍐炽?/p> Hash绱㈠紩鍩轰簬Hash琛ㄥ疄鐜帮紝鍙湁鏌ヨ鏉′欢绮剧‘鍖归厤Hash绱㈠紩涓殑鍒楁椂锛屾墠鑳藉浣跨敤鍒癶ash绱㈠紩銆傚浜嶩ash绱㈠紩涓殑鎵鏈夊垪锛屽瓨鍌ㄥ紩鎿庝細涓烘瘡琛岃绠椾竴涓猦ashcode锛孒ash绱㈠紩涓瓨鍌ㄧ殑灏辨槸hashcode銆?/p>
姣斿鎴戜滑鎯虫煡ID_card_n4瀵瑰簲username锛?/p>
鍥涗釜ID_card_n鍊煎苟涓嶄竴瀹氶掑锛岃繖鏍峰嵆浣垮鍔犳柊鐨刄ser锛岄熷害涔熷揩锛屽彧闇鍦ㄥ悗杩藉姞銆?褰撶劧缂虹偣涔熷緢鏄庢樉锛屼笉鏄湁搴忥紝鎵浠ash绱㈠紩鍋氬尯闂存煡璇㈤熷害寰堟參銆傛瘮濡傝鎵捐韩浠借瘉鍙峰湪[ID_card_X, ID_card_Y]鍖洪棿鐨勬墍鏈夌敤鎴凤紝灏遍』鍏ㄨ〃鎵弿銆?/p> 2 Hash绱㈠紩鐨勭己闄?/h2>
瑕佷娇InnoDB鎴朚yISAM鏀寔鍝堝笇绱㈠紩锛屽彲浠ラ氳繃浼搱甯岀储寮曟潵瀹炵幇锛屽彨鑷傚簲鍝堝笇绱㈠紩銆?/p> 鍙氳繃澧炲姞涓涓瓧娈碉紝瀛樺偍hash鍊硷紝灏唄ash鍊煎缓绔嬬储寮曪紝鍦ㄦ彃鍏ュ拰鏇存柊鐨勬椂鍊欙紝寤虹珛瑙﹀彂鍣紝鑷姩娣诲姞璁$畻鍚庣殑hash鍒拌〃閲屻?/p> 鍝堝笇琛ㄨ繖绉嶇粨鏋勯傜敤浜庡彧鏈夌瓑鍊兼煡璇㈢殑鍦烘櫙锛屾瘮濡侻emcached銆?/p> 3 妗堜緥搴旂敤鍋囧鏈変竴涓潪甯搁潪甯稿ぇ鐨勮〃锛屾瘮濡傜敤鎴风櫥褰曟椂闇瑕侀氳繃email妫绱㈠嚭鐢ㄦ埛锛屽鏋滅洿鎺ュ湪email鍒楀缓绱㈠紩锛岄櫎浜嗙储寮曞尯闂村尮閰嶏紝杩樿杩涜瀛楃涓插尮閰嶆瘮瀵癸紝email鐭繕濂斤紝濡傛灉闀跨殑璇濊繖涓煡璇唬浠峰氨姣旇緝澶с?鑻ユ鏃讹紝鍦╡mail寤虹珛鍝堝笇绱㈠紩锛屾煡璇互int鏌ヨ锛屾ц兘灏辨瘮瀛楃涓叉瘮瀵规煡璇㈠揩澶氫簡銆?/p> Hash 绠楁硶寤虹珛鍝堝笇绱㈠紩锛岄鍏堝氨瑕侀夊畾鍝堝笇绠楁硶锛屻婇珮鎬ц兘MySQL銆嬭鍒扮殑CRC32绠楁硶銆?/p> INSERT UPDATE SELECT 鎿嶄綔鍦ㄨ〃涓坊鍔爃ash鍊肩殑瀛楁锛?/p> ALTER TABLE `User` ADD COLUMN email_hash int unsigned NOT NULL DEFAULT 0; 鎺ヤ笅鏉ュ氨鏄湪UPDATE鍜孖NSERT鏃讹紝鑷姩鏇存柊 email_hash 瀛楁锛岄氳繃瑙﹀彂鍣ㄥ疄鐜帮細 DELIMITER | CREATE TRIGGER user_hash_insert BEFORE INSERT ON `User` FOR EACH ROW BEGIN SET NEW.email_hash=crc32(NEW.email); END; | CREATE TRIGGER user_hash_update BEFORE UPDATE ON `User` FOR EACH ROW BEGIN SET NEW.email_hash=crc32(NEW.email); END; | DELIMITER ; 杩欐牱SELECT璇锋眰灏变細鍙樻垚锛?/p> SELECT `email`, `email_hash` FROM `User` WHERE email_hash = CRC32(鈥渪xoo@gmail.com鈥? AND `email`= 鈥渪xoo@gmail.com鈥?
AND email = "xxoo@gmail.com" 鏄负浜嗛槻姝㈠搱甯岀鎾炴椂鏁版嵁涓嶅噯纭?/p> 鍒版杩欑瘒鍏充簬MySQL闈㈣瘯棰樿瑙d箣濡備綍璁剧疆Hash绱㈠紩鐨勬枃绔犲氨浠嬬粛鍒拌繖浜?鏇村鐩稿叧MySQL 璁剧疆Hash绱㈠紩鍐呭璇锋悳绱㈣剼鏈箣瀹朵互鍓嶇殑鏂囩珷鎴栫户缁祻瑙堜笅闈㈢殑鐩稿叧鏂囩珷甯屾湜澶у浠ュ悗澶氬鏀寔鑴氭湰涔嬪锛?/p> |