本文目錄一覽:
- 1、mysql索引有幾種
- 2、為什麼MySQL字符串不加引號索引會失效?這個答案是我見過最靠譜
- 3、MySQL——關於索引的總結
- 4、java兩年經驗面試都會問什麼問題
- 5、java對mysql中索引怎麼使用
- 6、java中怎麼使用mysql全文索引
mysql索引有幾種
Mysql目前主要有以下幾種索引類型:FULLTEXT,HASH,BTREE,RTREE。
那麼,這幾種索引有什麼功能和性能上的不同呢?
FULLTEXT
即為全文索引,目前只有MyISAM引擎支持。其可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使用,不過目前只有 CHAR、VARCHAR ,TEXT 列上可以創建全文索引。值得一提的是,在數據量較大時候,現將數據放入一個沒有全局索引的表中,然後再用CREATE INDEX創建FULLTEXT索引,要比先為一張表建立FULLTEXT然後再將數據寫入的速度快很多。
全文索引並不是和MyISAM一起誕生的,它的出現是為了解決WHERE name LIKE 「%word%”這類針對文本的模糊查詢效率較低的問題。在沒有全文索引之前,這樣一個查詢語句是要進行遍曆數據表操作的,可見,在數據量較大時是極其的耗時的,如果沒有異步IO處理,進程將被挾持,很浪費時間,當然這裡不對異步IO作進一步講解,想了解的童鞋,自行谷哥。
全文索引的使用方法並不複雜:
創建ALTER TABLE table ADD INDEX `FULLINDEX` USING FULLTEXT(`cname1`[,cname2…]);
使用SELECT * FROM table WHERE MATCH(cname1[,cname2…]) AGAINST (‘word’ MODE );
其中, MODE為搜尋方式(IN BOOLEAN MODE ,IN NATURAL LANGUAGE MODE ,IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION / WITH QUERY EXPANSION)。
關於這三種搜尋方式,愚安在這裡也不多做交代,簡單地說,就是,布爾模式,允許word里含一些特殊字符用於標記一些具體的要求,如+表示一定要有,-表示一定沒有,*表示通用匹配符,是不是想起了正則,類似吧;自然語言模式,就是簡單的單詞匹配;含表達式的自然語言模式,就是先用自然語言模式處理,對返回的結果,再進行表達式匹配。
對搜索引擎稍微有點了解的同學,肯定知道分詞這個概念,FULLTEXT索引也是按照分詞原理建立索引的。西文中,大部分為字母文字,分詞可以很方便的按照空格進行分割。但很明顯,中文不能按照這種方式進行分詞。那又怎麼辦呢?這個向大家介紹一個Mysql的中文分詞插件Mysqlcft,有了它,就可以對中文進行分詞,想了解的同學請移步Mysqlcft,當然還有其他的分詞插件可以使用。
HASH
Hash這個詞,可以說,自打我們開始碼的那一天起,就開始不停地見到和使用到了。其實,hash就是一種(key=value)形式的鍵值對,如數學中的函數映射,允許多個key對應相同的value,但不允許一個key對應多個value。正是由於這個特性,hash很適合做索引,為某一列或幾列建立hash索引,就會利用這一列或幾列的值通過一定的算法計算出一個hash值,對應一行或幾行數據(這裡在概念上和函數映射有區別,不要混淆)。在java語言中,每個類都有自己的hashcode()方法,沒有顯示定義的都繼承自object類,該方法使得每一個對象都是唯一的,在進行對象間equal比較,和序列化傳輸中起到了很重要的作用。hash的生成方法有很多種,足可以保證hash碼的唯一性,例如在MongoDB中,每一個document都有系統為其生成的唯一的objectID(包含時間戳,主機散列值,進程PID,和自增ID)也是一種hash的表現。額,我好像扯遠了-_-!
由於hash索引可以一次定位,不需要像樹形索引那樣逐層查找,因此具有極高的效率。那為什麼還需要其他的樹形索引呢?
在這裡愚安就不自己總結了。引用下園子里其他大神的文章:來自 14的路 的MySQL的btree索引和hash索引的區別
(1)Hash 索引僅僅能滿足”=”,”IN”和”=”查詢,不能使用範圍查詢。
由於 Hash 索引比較的是進行 Hash 運算之後的 Hash 值,所以它只能用於等值的過濾,不能用於基於範圍的過濾,因為經過相應的 Hash 算法處理之後的 Hash 值的大小關係,並不能保證和Hash運算前完全一樣。
(2)Hash 索引無法被用來避免數據的排序操作。
由於 Hash 索引中存放的是經過 Hash 計算之後的 Hash 值,而且Hash值的大小關係並不一定和 Hash 運算前的鍵值完全一樣,所以數據庫無法利用索引的數據來避免任何排序運算;
(3)Hash 索引不能利用部分索引鍵查詢。
對於組合索引,Hash 索引在計算 Hash 值的時候是組合索引鍵合併後再一起計算 Hash 值,而不是單獨計算 Hash 值,所以通過組合索引的前面一個或幾個索引鍵進行查詢的時候,Hash 索引也無法被利用。
(4)Hash 索引在任何時候都不能避免表掃描。
前面已經知道,Hash 索引是將索引鍵通過 Hash 運算之後,將 Hash運算結果的 Hash 值和所對應的行指針信息存放於一個 Hash 表中,由於不同索引鍵存在相同 Hash 值,所以即使取滿足某個 Hash 鍵值的數據的記錄條數,也無法從 Hash 索引中直接完成查詢,還是要通過訪問表中的實際數據進行相應的比較,並得到相應的結果。
(5)Hash 索引遇到大量Hash值相等的情況後性能並不一定就會比B-Tree索引高。
對於選擇性比較低的索引鍵,如果創建 Hash 索引,那麼將會存在大量記錄指針信息存於同一個 Hash 值相關聯。這樣要定位某一條記錄時就會非常麻煩,會浪費多次表數據的訪問,而造成整體性能低下。
愚安我稍作補充,講一下HASH索引的過程,順便解釋下上面的第4,5條:
當我們為某一列或某幾列建立hash索引時(目前就只有MEMORY引擎顯式地支持這種索引),會在硬盤上生成類似如下的文件:
hash值 存儲地址
1db54bc745a1 77#45b5
4bca452157d4 76#4556,77#45cc…
…
hash值即為通過特定算法由指定列數據計算出來,磁盤地址即為所在數據行存儲在硬盤上的地址(也有可能是其他存儲地址,其實MEMORY會將hash表導入內存)。
這樣,當我們進行WHERE age = 18 時,會將18通過相同的算法計算出一個hash值==在hash表中找到對應的儲存地址==根據存儲地址取得數據。
所以,每次查詢時都要遍歷hash表,直到找到對應的hash值,如(4),數據量大了之後,hash表也會變得龐大起來,性能下降,遍歷耗時增加,如(5)。
BTREE
BTREE索引就是一種將索引值按一定的算法,存入一個樹形的數據結構中,相信學過數據結構的童鞋都對當初學習二叉樹這種數據結構的經歷記憶猶新,反正愚安我當時為了軟考可是被這玩意兒好好地折騰了一番,不過那次考試好像沒怎麼考這個。如二叉樹一樣,每次查詢都是從樹的入口root開始,依次遍歷node,獲取leaf。
BTREE在MyISAM里的形式和Innodb稍有不同
在 Innodb里,有兩種形態:一是primary key形態,其leaf node里存放的是數據,而且不僅存放了索引鍵的數據,還存放了其他字段的數據。二是secondary index,其leaf node和普通的BTREE差不多,只是還存放了指向主鍵的信息.
而在MyISAM里,主鍵和其他的並沒有太大區別。不過和Innodb不太一樣的地方是在MyISAM里,leaf node里存放的不是主鍵的信息,而是指向數據文件里的對應數據行的信息.
RTREE
RTREE在mysql很少使用,僅支持geometry數據類型,支持該類型的存儲引擎只有MyISAM、BDb、InnoDb、NDb、Archive幾種。
相對於BTREE,RTREE的優勢在於範圍查找.
各種索引的使用情況
(1)對於BTREE這種Mysql默認的索引類型,具有普遍的適用性
(2)由於FULLTEXT對中文支持不是很好,在沒有插件的情況下,最好不要使用。其實,一些小的博客應用,只需要在數據採集時,為其建立關鍵字列表,通過關鍵字索引,也是一個不錯的方法,至少愚安我是經常這麼做的。
(3)對於一些搜索引擎級別的應用來說,FULLTEXT同樣不是一個好的處理方法,Mysql的全文索引建立的文件還是比較大的,而且效率不是很高,即便是使用了中文分詞插件,對中文分詞支持也只是一般。真要碰到這種問題,Apache的Lucene或許是你的選擇。
(4)正是因為hash表在處理較小數據量時具有無可比擬的素的優勢,所以hash索引很適合做緩存(內存數據庫)。如mysql數據庫的內存版本Memsql,使用量很廣泛的緩存工具Mencached,NoSql數據庫redis等,都使用了hash索引這種形式。當然,不想學習這些東西的話Mysql的MEMORY引擎也是可以滿足這種需求的。
(5)至於RTREE,愚安我至今還沒有使用過,它具體怎麼樣,我就不知道了。有RTREE使用經歷的同學,到時可以交流下!
為什麼MySQL字符串不加引號索引會失效?這個答案是我見過最靠譜
作為一名程序員,在求職面試時,不知你有沒有遇到類似這樣的問題。
張工是一名java程序員,最近到一家軟件公司應聘軟件開發崗位,面試官問了他關於MySql索引這樣的一個問題。
對於這個問題張工之前在做項目時也曾遇到,那時候字段明明是加了索引,可不明白為什麼還是很慢。後加上引號就正常了,為了趕項目進度,張工也沒有再去留意。
現在面試官突然這麼一問,張工也說不出個所以然來。
面試官讓他回去等通知。
我們知道MySql索引可以加快數據檢索速度,這也是使用的索引的最主要原因。但有時候使用不當就會遇到索引失效問題,譬如在MySQL字符串類型查詢時不加引號索引會失效,是因為MySQL內部進行了隱式轉換。
那為什麼會發生隱式轉換?又是怎麼轉換的呢?
今天我們來聊聊關於MySql索引失效的話題。
先來看看一般導致索引失效的有哪些?
如果一張表的索引有多個,要遵守最佳左前綴法則,即查詢從索引的最左前列開始並且不跳過索引中的列。
用戶表tb_user字段 id,name,age,sex
創建索引為idx_user_name
執行語句:
這時候就會導致索引失效
在索引列上做加工操作,查詢時會導致索引失效,從而導致全表掃描。所以,建議不要在索引列上做任何操作。
舉個例子,例如訂單表tb_order有個索引是dt(日期), 字段數據存放的格式是這樣的2021-12-10 這樣的,如果有個需求需要根據dt,格式是20220207這樣的來查詢,這時候就不要對dt進行格式轉換了,
這樣索引就失效了。
而是應該對 20220207做格式處理
這樣dt索引才不會失效。
例如我們在訂單表tb_order建立了索引idx_order_id,order_id字段類型為varchar
在查詢時如果使用where order_id= 20220207123654100,這樣的查詢方式會直接造成索引失效。
要讓索引生效,正確的用法為
假如有張用戶表tb_user,創建的索引為idx_user_name_age_sex_phone 其中name、age、sex都加了索引。
執行語句
上面這條sql語句只會命中name和age索引,sex索引會失效,複合索引失效需要查看key_len的長度。
再來看一個例子:
從這兩條SQL執行的結果我們可以看出,執行第一條SQL沒有使用到索引,而執行第二條SQL時使用到了索引。這是為什麼呢?
我們需要先了解下mysql索引優化器工作的原理。選擇索引是優化器工作,優化器工作有自己的一套規則,如果等號兩邊的數據類型不一致,則會發生隱式轉換。
基於這條規則,我們回過頭看看
這條SQL語句執行時就會變為
由於對索引列進行了函數操作,所以才導致索引失效,從而全表掃描了。
那麼問題來了,細心的你不知有沒有留意到為什麼是把左側的列轉為int類型,而不是把右側的值轉成字符串類型呢?
什麼情況下把數字轉為字符串,什麼情況下把字符串轉為數字,優化器它是根據什麼規則來進行判斷的?其實規則也並不複雜。
根據這個規則,我們再回過頭看看之前的查詢語句
select ‘12345678936’ = 12345678936
返回1 所以這時候就把左側的列值12345678936轉成數字。
關於MySql索引失效的問題先簡單寫到這,建議平時在做項目時還是要多了解下原理,如果你了解其背後的原理,求職面試時和面試官交流起來就會很舒服了,相信能為這次面試加分,提高被錄用的概率。
為什麼MySQL字符串類型查詢時不加引號索引會失效?這是因為要查詢的字符串字段沒有加引號時,MySQL內部進行了隱式轉換,此次查詢會導致全表掃描,所以慢了。
總結:
在索引列上進行了函數操作,MySQL內部會進行了隱式轉換,導致索引失效,從而產生全表掃描。
由於筆者知識及水平有限,文中錯漏之處在所難免,如有不足之處,歡迎交流。
拓展
索引創建
1、主鍵索引:
2、唯一索引:
3、普通索引:
4、全文索引:
alter table table_name add fulltext (column)
5、聯合索引:
索引刪除
MySQL——關於索引的總結
首先說說索引的 優點 :最大的好處無疑就是提高查詢效率。有的索引還能保證數據的唯一性,比如唯一索引。
而它的 壞處 也很明顯:索引也是文件,我們在創建索引時,也會創建額外的文件,所以會佔用一些硬盤空間。其次,索引也需要維護,我們在增加刪除數據的時候,索引也需要去變化維護。當一個表的索引多了以後,資源消耗是很大的,所以必須結合實際業務再去確定給哪些列加索引。
再說說索引的基本結構。一說到這裡肯定會脫口而出:B+樹!了解B+樹前先要了解二叉查找樹和二叉平衡樹。 二叉查找樹 :左節點比父節點小,右節點比父節點大,所以二叉查找樹的中序遍歷就是樹的各個節點從小到大的排序。 二叉平衡樹 :左右子樹高度差不能大於1。B+樹就是結合了它們的特點,當然,不一定是二叉樹。
為什麼要有二叉查找樹的特點?? 因為查找效率快,二分查找在這種結構下,查找效率是很快的。 那為什麼要有平衡樹的特點呢? 試想,如果不維護一顆樹的平衡性,當插入一些數據後,樹的形態有可能變得很極端,比如左子樹一個數據沒有,而全在右子樹上,這種情況下,二分查找和遍歷有什麼區別呢?而就是因為這些特點需要去維護,所以就有了上面提到的缺點,當索引很多後,反而增加了系統的負擔。
接著說B+樹。 它的結構如下 :
可以發現,葉子節點其實是一個 雙向循環鏈表 ,這種結構的好處就是,在範圍查詢的時候,我只用找到一個數據,就可以直接返回剩餘的數據了。比如找小於30的,只用找到30,其餘的直接通過葉子節點間的指針就可以找到。再說說其他特點: 數據只存在於葉子節點 。當葉子節點滿了,如果再添加數據,就會拆分葉子節點,父節點就多了個子節點。如果父節點的位置也滿了,就會擴充高度,就是拆分父節點,如25 50 75拆分成:25為左子樹,75為右子樹,50變成新的頭節點,此時B+樹的高度變成了3。它們的擴充的規律如下表,Leaf Page是葉子節點,index Page是非葉子節點。
再說說B樹 ,B樹相比較B+樹,它所有節點都存放數據,所以在查找數據時,B樹有可能沒到達葉子節點就結束了。再者,B樹的葉子節點間不存在指針。
最後說說Hash索引 ,相較於B+樹,Hash索引最大的優點就是查找數據快。但是Hash索引最大的問題就是不支持範圍查詢。試想,如果查詢小於30的數據,hash函數是根據數據的值找到其對應的位置,誰又知道小於30的有哪幾個數據。而B+樹正好相反,範圍查詢是它的強項。
附錄: Hash到底是啥?? 哈希中文名散列,哈希只是它的音譯。 為啥都說Hash快?? 首先有一塊哈希表(散列表),它的數據結構是個數組,一個任意長度的數據通過hash函數都可以變成一個固定長度的數據,叫hash值。然後通過hash值確定在數組中的位置,相同數據的hash值是相同的,所以我們存儲一個數據以後,只需O(1)的時間複雜度就可以找到數據。 那hash函數又是啥?? 算術運算或位運算,很多應用里都有hash函數,但實際運算過程大不一樣。這是Java里String的hashCode方法:
publicint hashCode() {
}
還有一個問題,hash函數計算出來的hash值有可能存在碰撞,即兩個不同的數據可能存在相同的hash值,在MySQL或其他的應用中,如Java的HashMap等,如果存在碰撞就會以當前數組位置為頭節點,轉變成一個鏈表。
說到這裡也清楚了為啥Java中引用類型要同時重寫hashCode和equals了。兩個對象,實例就算一模一樣,它們的hash值也不相等, 為啥不相等?? 默認的Object的hashCode方法會根據對象來計算hash值的,實例相同,但它們還是兩個不同的對象啊,所以我們重寫hashCode時,最簡單的方法就是調用Object的hashCode方法,然後傳入該引用類型的屬性,讓hashCode方法只根據這幾個屬性來計算,那麼實例相同的話,它們的hash值也會相等。等hashCode比較完後,如果相等再比較實例內容,也就是equals,確保不是hash碰撞。
索引的分類
如果我們指定了一個主鍵,那麼這個主鍵就是主鍵索引。如果我們沒有指定,Mysql就會自動找一個非空的唯一索引當主鍵。如果沒有這種字段,Mysql就會創建一個大小為6位元組的自增主鍵。如果有多個非空的唯一索引,那麼就讓第一個定義為唯一索引的字段當主鍵,注意,是第一個定義,而不是建表時出現在前面的。
對於輔助索引來說,它們的B+樹結構稍微有點特殊,它們的葉子節點存儲的是主鍵,而不是整個數據。所以在大部分情況下,使用輔助索引查找數據,需要二次查找。但並不是所有情況都需要二次查找。比如查找的數據正好就是當前索引字段的值,那麼直接返回就行。這裡提一句,B+樹的key就是對應索引字段的內容。
而輔助索引又有一些分類:唯一索引:不能出現重複的值,也算一種約束。普通索引:可以重複、可以為空,一般就是查詢時用到。前綴索引:只適用於字符串類型數據,對字符串前幾個字符創建索引。全文索引:作用是檢測大文本數據中某個關鍵字,這也是搜索引擎的一種技術。
注意,聚集索引、非聚集索引和前面幾個索引的分類並不是一個層面上的。上面的幾個分類是從索引的作用來分析的。聚集、非聚集索引是從索引文件上區分的。主鍵索引就屬於聚集索引,即索引和數據存放在一起,葉子節點存放的就是數據。數據表的.idb文件就是存放該表的索引和數據。
輔助索引屬於非聚集索引,說到這也就明白了。索引和數據不存放在一起的就是非聚集索引。在MYISAM引擎中,數據表的.MYI文件包含了表的索引, 該表的 葉子節點存儲索引和索引對應數據的指針,指向.MYD文件的數據。
索引的幾點使用經驗
經常被查詢的字段;經常作為條件查詢的字段;經常用於外鍵連接或普通的連表查詢時進行相等比較字段;不為null的字段;如果是多條件查詢,最好創建聯合索引,因為聯合索引只有一個索引文件。
經常被更新的字段、不經常被查詢的字段、存在相同功能的字段
java兩年經驗面試都會問什麼問題
個人介紹:
首先介紹下我面試時的自身條件情況,我把自己的情況分為優勢和劣勢來說可能更有利於你們比較自身情況。
劣勢:
1.15年7月畢業後開始到上海工作,面試的時候是17年3月到4月,一年多的經驗,勉強算兩年經驗。分析:一年多經驗我認為是比較尷尬的,處於一個不上不下的位置,很多公司比較喜歡招三年經驗的,或者直接招應屆生來培養。
2.畢業於一個非985/211,勉強上一本的高校。分析:這個相對影響較小,因為有工作經驗後,公司對學校的要求就沒那麼高了,只要是本科就基本沒問題,但是還是有個別叼毛公司只要985/211。
3.前一家公司是傳統電信行業,加入項目組時,項目已經上線有段時間了,我們的任務就是有需求就開發,有bug就優化,其他時間就聊騷,各干各的,工作一年多跟在養老一樣,用一句話說就是編程5分鐘,扯淡2小時,項目經驗嚴重不足,沒開發過很難的需求。分析:這一點是最傷的,公司招有經驗的就想看你都幹了些什麼牛批的東西,結果你告訴面試官我寫的需求都是垃圾。
優勢:
1.大學時拿過比較多的獎,每年都是校級優秀學生,畢業時是市級優秀畢業生,拿過省級ACM二等獎等。分析:大學的榮譽對一個有工作經驗的人來說,公司不一定會看重,但是可能會對面試官產生微妙的影響,特別是ACM獎,我碰到過有的面試官也是搞過ACM的,有共同的話題聊起來總是比較容易的,但是也要注意不能把這一欄篇幅寫的過於多,只能當作點綴用,我當時是放在簡歷最後一欄,簡要的寫了最主要的幾個獎。
2.良好的溝通交流能力。分析:這個能力不會是關鍵性的,但是可以加分。
3.較強的學習能力和邏輯思維能力。分析:有些公司和面試官還是比較看重一個人的學習能力的,經驗代表着你現在在什麼級別,而學習能力則代表着你將來能到達什麼級別。
學習過程:
看了我的優劣勢介紹,你會發現我的優勢相對於我的劣勢來說,簡直不值一提。我自己對此也有清晰的認識,因此從過完年之後,我就開始抓緊空閑時間學習。學習的過程如下:
1.看面試題
正常人第一步肯定都會看面試題,我也不例外,在看的過程中,我發現有些文章寫的不錯,對我幫助不小值得推薦,如下:
Java面試題全集(上)很多基礎的東西,建議先看。
各大公司Java後端開發面試題總結
面試心得與總結—BAT、網易、蘑菇街
關於Java面試,你應該準備這些知識點
2.深入學習
在看面試題的過程,你會遇到一些自己沒接觸過的或者以前沒深入學習過的知識,例如最常問的HashMap內部實現原理,這就促使你得開始去看jdk的源碼或者是學習一些新的東西。看源碼是很重要的一步,起步很難,但是會讓你收益良多,看源碼的過程如果碰到無法理解的地方,可以百度看下別人的理解。我學習源碼的過程中,看過幾個人的關於源碼的文章寫的很不錯,如下:
五月的倉頡
佔小狼
zhangshixi的Core java系列
3.熟悉項目
找出自己工作以來開發過的最叼的功能,將整個功能的流程和涉及的東西吃透。項目是面試中必問的環節,一般是以一個功能點為基礎展開問,因此你必須對這個功能有很深的認識,不能有模糊的地方。如果有時間,能把涉及到的知識點也搞懂最好。
4.做面試題
有不少公司是有面試的,如果你沒有準備過,很容易在各種小地方犯錯,建議去一些面試題網站多做些題目,我自己是用的牛客網。
5.學習記錄
把自己每天的學習時間和學習內容記錄下來,可以讓自己更有動力的學習,學習是一個枯燥的過程,你必須讓自己時刻保持有動力。
投簡歷、約面試環節
1.在哪些網站投?
拉勾網、BOSS直聘、獵聘網。
2.是否該海投?
投簡歷分為兩個情況。
1)沒有社招面試經驗:建議採取海投的方式,只要職位要求跟自己比較匹配都可以投,累計面試經驗。這個環節可以把投簡歷的網站增加兩家:智聯和無憂。
2)自認為社招面試經驗已經足夠:投那些職位匹配、公司滿意的職位。公司評價可以去看準網、百度、知乎等查詢。
3.一天約幾家面試合適?
最理想的情況為2家面試,上午一般在10點左右,下午一般在2點左右。建議把理想的公司放下午,因為下午的時間比較充足,可以讓公司更充分的了解你。我開始面的時候,每次都是上午面的不好,下午面的不錯。
4.投簡歷經常沒下文?
我當初也沒想到簡歷篩選這關有這麼難,可能是我的簡歷確實亮點不多,再者HR很多都不是行內人,因此他們看得最直接的就是你上家的公司和你畢業的學校,如果你不是從牛逼的公司/學校出來,可能會碰到和我一樣的情況,應對的辦法就是多投。
5.是否該裸辭?
我一開始是邊上班邊投,然後利用調休時間,或者請假去面試。後來,面試機會越來越多,請假太頻繁了,自己都不好意思了,並且自己也已經有足夠的信心,這個時候我選擇了裸辭。裸辭還有一個原因是,在面試過程中你會發現,有的公司要人要的緊,如果你的辭職流程過長可能會導致你錯過這個公司。
6.注意事項
1)面試前一天把路線和時間算好,最好別遲到。
2)背個書包,帶好簡歷、充電寶、紙巾、雨傘。
面試環節
1.筆試常見的問題?
面試常見的問題上面給的面試題鏈接基本都有。我只提幾點:1)寫SQL:寫SQL很常考察group by、內連接和外連接。2)手寫代碼:手寫代碼一般考單例、排序、線程、消費者生產者。我建議排序算法除了冒泡排序,最好還能手寫一種其他的排序代碼。試想:如果一般面試者都寫的冒泡排序,而你寫的是快速排序/堆排序,肯定能給面試官留下不錯的印象。
2.面試流程?
1)讓你自我介紹
2)問Java基礎知識
3)問項目
4)情景問題,例如:你的一個功能上了生產環境後,服務器壓力驟增,該怎麼排查。
5)你有什麼想問面試官的
3.面試常問的知識點?
1)集合相關問題(必問):
HashMap、LinkedHashMap、ConcurrentHashMap、ArrayList、LinkedList的底層實現。
HashMap和Hashtable的區別。
ArrayList、LinkedList、Vector的區別。
HashMap和ConcurrentHashMap的區別。
HashMap和LinkedHashMap的區別。
HashMap是線程安全的嗎。
ConcurrentHashMap是怎麼實現線程安全的。
2)線程相關問題(必問):
創建線程的3種方式。
什麼是線程安全。
Runnable接口和Callable接口的區別。
wait方法和sleep方法的區別。
synchronized、Lock、ReentrantLock、ReadWriteLock。
介紹下CAS(無鎖技術)。
什麼是ThreadLocal。
創建線程池的4種方式。
ThreadPoolExecutor的內部工作原理。
分佈式環境下,怎麼保證線程安全。
3)JVM相關問題:
介紹下垃圾收集機制(在什麼時候,對什麼,做了什麼)。
垃圾收集有哪些算法,各自的特點。
類加載的過程。
雙親委派模型。
有哪些類加載器。
能不能自己寫一個類叫java.lang.String。
4)設計模式相關問題(必問):
先問你熟悉哪些設計模式,然後再具體問你某個設計模式具體實現和相關擴展問題。
5)數據庫相關問題,針對Mysql(必問):
給題目讓你手寫SQL。
有沒有SQL優化經驗。
Mysql索引的數據結構。
SQL怎麼進行優化。
SQL關鍵字的執行順序。
有哪幾種索引。
什麼時候該(不該)建索引。
Explain包含哪些列。
Explain的Type列有哪幾種值。
6)框架相關問題:
Hibernate和Mybatis的區別。
Spring MVC和Struts2的區別。
Spring用了哪些設計模式。
Spring中AOP主要用來做什麼。
Spring注入bean的方式。
什麼是IOC,什麼是依賴注入。
Spring是單例還是多例,怎麼修改。
Spring事務隔離級別和傳播性。
介紹下Mybatis/Hibernate的緩存機制。
Mybatis的mapper文件中#和$的區別。
Mybatis的mapper文件中resultType和resultMap的區別。
Mybatis中DAO層接口沒有寫實現類,Mapper中的方法和DAO接口方法是怎麼綁定到一起的,其內部是怎麼實現的。
7)其他遇到問題:
介紹下棧和隊列。
IO和NIO的區別。
接口和抽象類的區別。
int和Integer的自動拆箱/裝箱相關問題。
常量池相關問題。
==和equals的區別。
重載和重寫的區別。
String和StringBuilder、StringBuffer的區別。
靜態變量、實例變量、局部變量線程安全嗎,為什麼。
try、catch、finally都有return語句時執行哪個。
介紹下B樹、二叉樹。
ajax的4個字母分別是什麼意思。
xml全稱是什麼。
分佈式鎖的實現。
分佈式session存儲解決方案。
常用的linux命令。
一些經驗:
1.先投一些普通公司,等面出了心得再去投理想的公司。
2.不熟悉的技術不要主動提。
3.對於那種實習期6個月還打8折的公司,除非你沒有其他選擇了,否則不要去。
4.小公司喜歡在薪水上壓你,開的時候適當提高。
5.不要去參加招聘會,純粹是浪費時間。
6.把面試當作一次技術的交流,不要太在意是否能被錄取。
7.公司一般面完就決定是否錄取了,讓你回去等消息這種情況一般沒戲,無論你自己覺得面的有多好。
8.盡量少通過電話面試,效果不好。
9.在面試的日子裏,要保持每天學習,無論是學習新東西還是複習舊東西。
10.拿到offer了,問問自己這個公司讓自己100%滿意了嗎,如果不是,請繼續努力找更好的。
11.通過面試官可以大概判斷這家公司的情況。
12.拉勾投的簡歷很多會被篩掉,但是拉勾還是面試機會的最主要來源。
13.理想的公司可以多投幾次,我有好幾次都是第一次投被篩掉,多投幾次就過的經驗。
14.問到自己有深入研究過的知識,抓住機會好好表現,不要輕易放過。
java對mysql中索引怎麼使用
1.索引示例
假設對於10.3節所建的表,各個表上都沒有索引,數據的排列也沒有規律,如表13.3所示。
表13.3 沒有索引的students表
sid
sname
sgender
sage
52
zhang
M
21
22
wang
M
22
33
li
F
19
41
zhao
M
20
…
…
…
當查找某個學生信息時,必須順序查看錶students中的每一行,檢查是否與所需值匹配,這需要掃描全表,效率很低。
表13.4給出了在name列上增加了索引的students表。
表13.4 在name列上增加了索引的students表
java中怎麼使用mysql全文索引
索引是自動使用的,不需要調用,至於創建索引,參照下面的sql
CREATE INDEX 索引名
ON 表名 (索引字段);
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/181820.html