JAVA初級工程師面試36問(四)

第十九問:   在性能測試中發現cpu佔用過高應該如何進行分析?

 

           1.查找進程(  top查看進程的佔用資源情況,可以很明顯看出java的那個進程佔用的過高cpu)

           2. 查找線程( 使用 top -H -p <pid> 查看線程佔用情況)

           3.查找java的堆棧信息 (將線程id轉換成十六進制) 

           4.使用jstack查詢線程的堆棧信息( jstack <pid> |grep -a 線程id(十六進制) )

 

第二十問: 簡述一下事務的隔離級別?

 

  1.未提交讀( 事務的最低隔離級別,一個事務可以讀到另一個事務未提交的數據。會出現髒讀的情況.

  2.已提交讀 (在一個事務修改數據過程中,如果事務沒有進行提交,其他事務不能讀取該數據。會出現不可重複讀的現象.

  3.可重複讀( 事務A在讀取數據的過程中,事務B也可以對相同數據進行讀取,但是不能進行修改直到事務A事務結束後,纔會釋放共享鎖,這時事務B纔可以增加排他鎖,對數據進行修改。會出現幻讀的現象.)

  4.序列化 ( 事務A在讀取A表時,增加了表級共享鎖,此時事務B也可以讀取A表,但是不能進行任何數據的修改,直到事務A事務結束。隨後事務B可以增加對A表的表級排他鎖,此時事務A不能讀取A表中的任何數據,更不能進行修改.)

 

第二十一問:請簡單解釋下髒讀、不可重複讀、幻讀?

          髒讀:事務A修改某個數據,同時,事務B來讀取,此時,事務A在進行回滾,此時,事務B讀取的是事務A回滾前的數據,                            即出現髒讀。


          不可重複讀:事務A讀取A數據,事務B也讀取A數據並修改了這個A數據,事務A在讀取A數據會發現兩次讀取的不一樣。


          幻讀:事務A修改了表A的所有數據,同時事務B向A表插入一條數據,事務A在讀A表,會發現還有一條沒有修改的數據,就                           像出現了幻覺一樣。
 

第二十二問:請問sql的書寫順序就是它的執行順序嗎?

             不是,sql的書寫順序跟執行順序不一樣的.   

             書寫順序  :

                SELECT →FROM → JOIN → ON → WHERE → GROUP BY → HAVING → ORDER BY→ LIMIT

             執行順序:

                FROM → JOIN → ON → WHERE → GROUP BY → HAVING → SELECT → ORDER BY→ LIMIT

第二十三問:請簡述一下存儲引擎MyISAM與InnoDB 區別與作用?

        MyISAM(5.5 版本前默認引擎)

  1. 只支持表級鎖,不支持行鎖。用戶在操作myisam表時,select,update,delete,insert語句都會給表自動加鎖 (讀取時對需要讀到的所有表加鎖,寫入時則對錶加排他鎖;)
  2. 不支持事務
  3. 不支持外鍵
  4. 不支持崩潰後的安全恢復                    

       InnoDB (5.5 版本後默認引擎)

  1. 支持行鎖,採用MVCC來支持高併發,有可能死鎖
  2. 支持事務
  3. 支持外鍵
  4. 支持崩潰後的安全恢復

       作用:

        1. MyISAM更適合讀密集的表,而InnoDB更適合寫密集的的表。 在數據庫做主從分離的情況下,經常選擇MyISAM作爲主庫的存儲引擎。

         2. 如果需要事務支持,並且有較高的併發讀取頻率(MyISAM的表鎖的粒度太大,所以當該表寫併發量較高時,要等待的查詢就會很多了),這時選InnoDB是不錯的。如果你的數據量很大(MyISAM支持壓縮特性可以減少磁盤的空間佔用),而且不需要支持事務時,MyISAM是最好的選擇。

第二十四問:關於sql優化你如何做的?

    1.對查詢進行優化,應儘量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。    
    
    2.應儘量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描.    

    3.應儘量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描。    
    
    4.應儘量避免在 where 子句中使用 or 來連接條件,否則將導致引擎放棄使用索引而進行全表掃描,

如:    
select id from t where num=10 or num=20    
可以這樣查詢:    
select id from t where num=10    
union all    
select id from t where num=20    
    
    5.in 和 not in 也要慎用,否則會導致全表掃描,

如:    
select id from t where num in(1,2,3)    
對於連續的數值,能用 between 就不要用 in 了:    
select id from t where num between 1 and 3    
    
    
   6.應儘量避免在 where 子句中對字段進行表達式操作,這將導致引擎放棄使用索引而進行全表掃描。

如:    
select id from t where num/2=100    
應改爲:    
select id from t where num=100*2    
    
   7.應儘量避免在where子句中對字段進行函數操作,這將導致引擎放棄使用索引而進行全表掃描。

如:    
select id from t where substring(name,1,3)='abc'--name以abc開頭的id    
應改爲:    
select id from t where name like 'abc%'    
    
   8.不要在 where 子句中的“=”左邊進行函數、算術運算或其他表達式運算,否則系統將可能無法正確使用索引。    
      
   9.在使用索引字段作爲條件時,如果該索引是複合索引,那麼必須使用到該索引中的第一個字段作爲條件時才能保證系統使用該索引,否則該索引將不會被使用,並且應儘可能的讓字段順序與索引順序相一致。

  10.任何地方都不要使用 select * from t ,用具體的字段列表代替“*”,不要返回用不到的任何字段

 

未完待續.....
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章