1. 程式人生 > 實用技巧 >mysql學習筆記1

mysql學習筆記1

MySQL 索引型別有:唯一索引,主鍵(聚集)索引,非聚集索引,全文索引。

聚集索引(Clustered index):資料行的物理順序與列值(一般是主鍵的那一列)的邏輯順序相同,一個表中只能擁有一個聚集索引。索引的葉子節點就是對應的資料,可以直接獲取到對應的全部列的資料,最好還是在建立表的時候新增聚集索引,由於聚集索引的物理順序上的特殊性,因此如果再在上面建立索引的時候會根據索引列的排序移動全部資料行上面的順序,會非常地耗費時間以及效能。MySQL的primary key就是聚集索引

非聚集索引:該索引中索引的邏輯順序與磁碟上行的物理儲存順序不同,一個表中可以擁有多個非聚集索引。非聚集索引葉節點仍然是索引節點,只是有一個指標指向對應的資料塊,此如果使用非聚集索引查詢,而查詢列中包含了其他該索引沒有覆蓋的列,那麼他還要進行第二次的查詢,查詢節點上對應的資料行的資料。

使用心得:

  1. 使用聚集索引的查詢效率要比非聚集索引的效率要高,但是如果需要頻繁去改變聚集索引的值,寫入效能並不高,因為需要移動對應資料的物理位置。
  2. 非聚集索引在查詢的時候可以的話就避免二次查詢,這樣效能會大幅提升。

MySQL的兩種儲存引擎

MyISAM:B+Tree葉節點的data域存放的是資料記錄的地址。在索引檢索的時候,首先按照B+Tree搜尋演算法搜尋索引,如果指定的Key存在,則取出其data域的值,然後以data域的值為地址讀取相應的資料記錄。這被稱為“非聚簇索引”。

  InnoDB:其資料檔案本身就是索引檔案。相比MyISAM,索引檔案和資料檔案是分離的,其表資料檔案本身就是按B+Tree組織的一個索引結構,樹的葉節點data域儲存了完整的資料記錄。這個索引的key是資料表的主鍵,因此InnoDB表資料檔案本身就是主索引。這被稱為“聚簇索引(或聚集索引)”。而其餘的索引都作為輔助索引,輔助索引的data域儲存相應記錄主鍵的值而不是地址,這也是和MyISAM不同的地方

。在根據主索引搜尋時,直接找到key所在的節點即可取出資料;在根據輔助索引查詢時,則需要先取出主鍵的值,在走一遍主索引。因此,在設計表的時候,不建議使用過長的欄位作為主鍵,也不建議使用非單調的欄位作為主鍵,這樣會造成主索引頻繁分裂。

MySQL常見面試題:mysql 常見面試題 - 割肉機 - 部落格園 (cnblogs.com)

(4條訊息) 面試必問的 MySQL,你懂了嗎?_程式設計師囧輝-CSDN部落格

分割槽:

如果表有一個主鍵或者外來鍵,partition表示式必須是主鍵或者外來鍵中的一個Column

如果表有多個主鍵或者外來鍵,partition表示式必須是多個主鍵的一個公共列

--無法建立Table,因為有2個主鍵,但是沒有一個公共的列

CREATE TABLE t2 (
col1 INT NOT NULL,
col2 DATE NOT NULL,
col3 INT NOT NULL,
col4 INT NOT NULL,
UNIQUE KEY (col1),
UNIQUE KEY (col3)
)
PARTITION BY HASH(col1 + col3)
PARTITIONS 4;

--這個是可以的,選擇聯合主鍵中的一個列或者多個列作為Partition表示式

CREATE TABLE t2 ( col1 INT NOT NULL, col2 DATE NOT NULL, col3 INT NOT NULL, col4 INT NOT NULL,

UNIQUE KEY (col1, col3) )

PARTITION BY HASH(col1 + col3) PARTITIONS 4;

2.只有InnoDB和MyiSAM支援partition.InnoDB storage engine.InnoDBforeign keys and MySQL partitioning are not compatible. PartitionedInnoDBtables cannot have foreign key references,

nor can they have columns referenced by foreign keys.InnoDBtables which have or which are referenced by foreign keys cannot be partitioned.

分割槽表的鎖

MySQL官網寫得是在5.7之前需要鎖整個表,但是之後用了partition lock pruning 優化了,儘量只鎖涉及操作的paritioned table 而非整表,而且這個只對於myISAM引擎,因為InnoDB是用的行鎖。