1. 程式人生 > 其它 >Java測開面試準備第三天

Java測開面試準備第三天

技術標籤:Java測開面試

mysql聚集索引和二級索引

每張使用 InnoDB 作為儲存引擎的表都有一個特殊的索引稱為聚集索引,它儲存著每一行的資料,通常,聚集索引就是主鍵索引。為了得到更高效的查詢、插入以及其他的資料庫操作的效能,你必須理解 InnoDB 引擎是如何使用聚集索引來優化常見的查詢和 DML 操作。

如果你的表定義了一個主鍵,InnoDB 就使用它作為聚集索引。因此,儘可能的為你的表定義一個主鍵,如果實在沒有一個數據列是唯一且非空的可以作為主鍵列,建議新增一個自動遞增列作為主鍵列。

如果你的表沒有定義主鍵,InnoDB 會選擇第一個唯一非空索引來作為聚集索引。

如果你的表既沒有主鍵,又沒有合適的唯一索引,InnoDB 內部會生成一個隱式聚集索引 —— GEN_CLUST_INDEX,該索引建立在由 rowid 組成的合成列上。資料行根據 InnoDB 分配的 rowid 排序,rowid 是一個 6 位元組的欄位,隨著資料插入而單調遞增。也就是說,資料行根據 rowid 排序實際上是根據插入順序排序。

通過聚集索引來訪問一行資料是非常快的,這是因為所有的行資料和索引在同一頁上。如果表特別大,相較於行資料和索引在不同頁上儲存結構(比如 myisam 引擎),這將大大節省磁碟 I/O 資源。

除了聚集索引外的其他索引型別都屬於二級索引。在 InnoDB 中,二級索引中的每個記錄都包含該行的主鍵列,以及二級索引指定的列;聚集索引中,InnoDB 通過主鍵值來查詢資料行。

如果主鍵過長,二級索引就需要更大的空間,因此,使用短的主鍵列是很有利的。

對於二級索引,葉子節點並不包含行記錄的全部資料。葉子節點除了包含鍵值以外,每個葉子節點中的索引行中還包含了一個書籤 —— 相應行資料的聚集索引鍵。

如果在一棵高度為 3 的二級索引樹中查詢資料,那需要對這顆二級索引樹遍歷3次找到指定聚集索引鍵。如果聚集索引樹的高度同樣為 3 ,那麼還需要對聚集索引樹進行 3 次查詢,最終找到一個完整的行資料所在的頁,因此一共需要 6 次邏輯 IO 訪問以得到最終的一個數據頁。

-----------------------

索引是一種用於快速查詢行的資料結構,就像一本書的目錄就是一個索引

那B+樹比起B樹有什麼優點呢?

1. 由於中間節點不存指標,同樣大小的磁碟頁可以容納更多的節點元素,樹的高度就小。(資料量相同的情況下,B+樹比B樹更加“矮胖”,就是說從磁碟中查詢資料次數更少,更少IO定址),查詢起來就更快。
2. B+樹每次查詢都必須到葉子節點才能獲取資料,而B樹不一定,B樹可以在非葉子節點上獲取資料。因此B+樹查詢的時間更穩定。
3. B+樹的每一個葉子節點都有指向下一個葉子節點的指標,葉子結點之間是類似連結串列的結構,對於範圍批量查詢效能很高,方便範圍查詢和全表查詢,順序掃描效能高:只需要從第一個葉子節點開始順著指標一直掃描下去即可,而B樹則要對樹做中序遍歷。

聚簇索引

  每個儲存引擎為InnoDB的表都有一個特殊的索引,叫聚集索引。聚集索引並不是一種單獨的索引型別,而是一種資料儲存方式。當表有聚集索引的時候,它的資料行實際上存放在葉子頁中。一個表不可能有兩個地方存放資料,所以一個表只能有一個聚集索引。
  因為是儲存引擎負責實現索引,因此不是所有的儲存引擎都支援聚集索引。InnoDB表中聚集索引的索引列就是主鍵,所以聚集索引也叫主鍵索引。

二級索引

在非主鍵列的其他列上建的索引就是二級索引,級索引可以有0個,1個或者多個

二級索引的節點頁和聚集索引一樣,只存被索引列的值,而二級索引的葉子頁除了索引列值,還存這一列對應的主鍵值。

二級索引的葉子節點中儲存的不是“行指標”,而是主鍵值,並以此作為指向行的“指標”。

這樣的策略減少了當出現行移動或者資料頁分裂時二級索引的維護工作。使用主鍵當做指標會讓二級索引佔更多空間,但好處是InnoDB在移動行時無需更新二級索引中的這個指標。

聚集索引的優點:

  • 可以把相關資料儲存在一起,例如實現電子郵箱時,根據使用者ID來聚集資料,讀取少數的資料頁就能獲取某個使用者的全部郵件。
  • 聚集索引將索引和資料儲存在同一個B樹中,因此從聚集索引中獲取資料比在非聚集索引中要快一些。

聚集索引的缺點:

  • 插入速度嚴重依賴插入順序。按照主鍵的順序插入是載入資料到InnoDB表中速度最快的方式。假如磁碟中的某一個已經存滿了,但是新增的行要插入到這一頁當中,儲存引擎就會把該也分裂成兩個頁面來容納該行,這就是一次頁分裂操作。頁分裂會導致表佔用更多的磁碟空間。
  • 更新聚集索引列的代價很高,會強制InnoDB將每個被更新的行移動到新的位置。
  • 用二級索引訪問資料需要兩個索引查詢,不是一次。因為要先從二級索引的葉子節點獲得主鍵值,再根據這主鍵去聚集索引中查到對應的行,所以需要兩次B樹查詢。

括號題:比如n=3,輸出 ()()() 、(())()、((()))、()(())

package waitMe;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;

/**
 * @Auther: zihan.tech
 * @Date: 2021-01-31
 * @Description: waitMe
 * @version: 1.0
 */
public class KuoHao {
    public static void main(String args[]){
        Scanner sc= new Scanner(System.in);
        int n = sc.nextInt();
        List<String> result = generateParaenthsis(n);
        Iterator i = result.iterator();
        while(i.hasNext()){
            System.out.println(i.next());
        }
    }
    public static List<String> generateParaenthsis(int n){
        List<String> result = new ArrayList<>();
        doGenerate(0,0,"",result,n);
        return result;
    }
    public static void doGenerate(int left, int right, String s, List<String> result, int n)
    {
        if(left == n && right == n){
            result.add(s);
            return;
        }
        if(left<n){
            doGenerate(left+1,right,s+"(",result,n);
        }
        if(right<n&&left>right){
            doGenerate(left,right+1,s+")",result,n);
        }
    }
}

jvm

Java記憶體空間(堆疊)

在這裡插入圖片描述

基本型別的變數物件的引用變數都是在函式的棧記憶體中分配

堆記憶體用來存放由new建立的記憶體陣列

在堆中產生一個數組或物件之後,還可以在棧中定義一個特殊的變數,讓棧中的這個變數的取值等於陣列或物件在堆記憶體中的首地址,棧中的這個變數就變成了陣列或物件的引用變數,以後就可以在程式中使用棧中的變數來訪問堆中的陣列或者物件,引用變數就相當於為陣列或者物件起的一個名字。

陣列和物件在沒有引用變數指向它的時候,才變為垃圾,不能再被使用,在隨後的一個不確定時間被垃圾回收器收走(釋放掉)。

這也是Java比較佔記憶體的原因,實際上,棧中的變數指向堆記憶體中的變數,這就是Java中的指標。

年輕代,年老代,永久代

年輕代和老年代的劃分是為了更好的記憶體分派及回收。提高效率。

堆是垃圾回收機制的重點區域。我們知道垃圾回收機制有三種,minor gc,major gc 和full gc。針對於堆的就是前兩種。年輕代的叫 minor gc,老年代的叫major gc。

資料庫三正規化

1.無重複列

2.不存在非主屬性對主屬性的部分函式依賴(學號 課名 姓名 系名 系主任 分數)

3.在2NF基礎上消除非主屬性對碼的傳遞函式依賴

死鎖

A鎖了資源1,B鎖了資源2

A想要資源2,B想要資源1

預防:資源一次性分配(破壞請求條件),只要有一個資源得不到分配,也不給這個程序分配其他資源(破壞請保持條件)可剝奪資源,當程序獲得了部分,得不到其它資源,則釋放佔有的資源(破壞不可剝奪條件)資源有序分配:系統給資源賦予編號,每一個程序按序號遞增請求資源,釋放則相反(破壞環路等待條件)

解除死鎖:剝奪資源,撤銷程序

銀行將演算法:當程序首次申請資源時,要測試該程序對資源的最大需求量,如果系統現存的資源可以滿足它的最大需求量則按當前的申請量分配資源,否則就推遲分配。當程序在執行中繼續申請資源時,先測試該程序本次申請的資源數是否超過了該資源所剩餘的總量。若超過則拒絕分配資源,若能滿足則按當前的申請量分配資源,否則也要推遲分配。

鎖機制

共享鎖

由讀表操作加上的鎖,加鎖後其他使用者只能獲取該表或行的共享鎖,不能獲取排它鎖,也就是說只能讀不能寫

排它鎖

由寫表操作加上的鎖,加鎖後其他使用者不能獲取該表或行的任何鎖,典型是mysql事務