記憶體的讀寫速度遠大於磁碟的讀寫速度,減少磁碟讀寫,可以作為重點優化方向。 資料庫內部最重要的就是存儲結構,存儲結構必然涉及到數據結構知識。比如用到了常用的哈希圖、樹。 MYSQL資料庫常用兩種引擎,InnoDB、MyISAM,可以直接對錶指定資料庫引擎。 MYSQL索引是一種數據結構,幫助更快的查詢 ...
- 記憶體的讀寫速度遠大於磁碟的讀寫速度,減少磁碟讀寫,可以作為重點優化方向。
- 資料庫內部最重要的就是存儲結構,存儲結構必然涉及到數據結構知識。比如用到了常用的哈希圖、樹。
- MYSQL資料庫常用兩種引擎,InnoDB、MyISAM,可以直接對錶指定資料庫引擎。
- MYSQL索引是一種數據結構,幫助更快的查詢數據。索引使用的是B+樹(B樹改進版,一個節點可以包含多個值,深度可控,IO讀寫次數少,三層可以保存數千萬個值)。葉子節點存值,其餘節點存索引值。數據結構可視化工具:https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html
- MYSQL生成的表和數據會保存在mysql/data目錄下,並以表名生成對應的目錄。FRM文件是表設計文件。
- InnoDB引擎,會在mysql/data/表目錄下生成IBD文件。IBD文件包含索引和數據,索引是聚集型索引。
- MyISAM引擎,會在mysql/data/表目錄下生成MYI和MYD文件,MYI是索引文件,記錄存儲地址,MYD是數據文件。索引是非聚集型索引。不支持事務。
- 使用索引註意事項:1>.不要在DML頻繁的表上加索引(一百萬條數據維護B+樹耗性能)。 2>.不要在數據較少的表上加索引。3>.儘量不要在索引列上加函數計算。 4>.不要select *查詢,索引會失效。5>.在查詢比較頻繁的表上加索引。6>.在離散量比較大的欄位加索引(計算方法:count(distinct col):count(col)越大越好,如uuid,外鍵ID等)。
- 儘量使用int自增作為主鍵,因為這樣符合數組的特性,數組查詢效率較高(訪問局部性原理,數組記憶體地址連續,讀取一個扇區的數據放入二級緩存即可,速度更快,不用反覆查詢記憶體)。
- InnoDB引擎創建的表,可以不設置主鍵。但是本身不能沒有主鍵,當不設主鍵的時候,會在表中找到非NULL並且設置為索引的欄位作為主鍵,如果找不到這樣的欄位,就用_rowid作為主鍵,這樣會導致查詢效率變差。1>全表掃描性能差。2>_rowid實現源自於全局的序列,這樣高併發插入數據共用此序列,MYSQL保證數據安全,會加上鎖。這必然導致性能降低。
- InnoDB引擎主鍵索引查詢時,會根據索引值直接在葉子節點拿到值。其他如欄位索引,會生成個B+樹,葉子節點保存本身索引值和主鍵值,再根據主鍵值回到主鍵索引B+樹中獲取真正的值(回表查詢)。