Mysql分析排序和锁阅读总结
對于 MySQL 數據庫而言,數據是存儲在文件里的,而為了能夠快速定位到某張表里的某條記錄進行查詢和修改,我們需要將這些數據以一定的數據結構進行存儲,這個數據結構就是我們說的索引。能夠支持快速查找的數據結構有:順序數組、哈希、搜索樹等。數組要求插入的時候保證有序,這樣查找的時候可以利用二分查找法達到O(log(N))的時間復雜度,對范圍查詢支持也很好,但是插入的時候如果不是在數組尾部,就需要摞動后面所有的數據,時間復雜度為O(N)。所以有序數組只適合存儲靜態數據,例如幾乎很少變動的配置數據,或者是歷史數據。磁盤O是一個相對很慢的操作,為了提高讀取速度,我們應該盡量減少磁盤IO操作,而操作系統一般以4kb 為一個數據頁讀取數據,而 MySQL 一般為16kb 作為一個數據塊,已經讀取的數據塊會在內存進行緩存,如果多次數據讀取在同一個數據塊,則只需要一次磁盤IO,而如果順序一致的記錄在文件中也是順序存儲的,就可以一次讀取多個數據塊,這樣范圍查詢的速度也可以大大提升,顯然鏈表沒有這方面的優勢。哈希表通過一個特定的哈希函數將 key 值轉換為一個固定的地址,然后將對應的 value 放到這個位置,如果發生哈希碰撞就在這個位置拉出一個鏈表,由于哈希函數的離散特性,所以經過哈希函數處理后的 key 將失去原有的順序,所以哈希結構的索引無法滿足范圍查詢,只適合等值查詢的情況例如一些緩存的場景。二叉樹在極端情況下會變成線性結構,也就是每個節點都只有左子節點或者只有右子節點,這樣就無法利用二分查找只能從第一個節點開始向后遍歷了,所以為了維持O(log(N))的時間復雜度,我們需要在插入節點的時候對節點進行調整以保證樹的平衡,所以平衡二叉樹插入的時間復雜度也是 O(log(N)),為了盡量的減少磁盤讀寫次數,一般用N叉樹來代替二叉樹
總結來說,數據是以行為單位存儲在聚簇索引里的,根據主鍵查詢可以利用聚簇索引定位到所在記錄,根據普通索引查詢需要先在普通索引上找到對應的主鍵的值,然后根據主鍵值去聚簇索引上查找記錄,俗稱回表。普通索引上存儲的值是主鍵的值,如果主鍵是一個很長的字符串并且建了很多普通索引,將造成物理空間被占據很大空間,而這也促使使用自增ID來作為主鍵,另一個原因是因為自增ID在插入的時候可以保證相鄰的兩條記錄可能在同一個數據塊,而其他的元素連續性在設計上可能沒有自增ID好,導致連續插入可能在多個數據塊,增加了磁盤讀寫次數。
?
轉載于:https://www.cnblogs.com/ggrm/p/11048810.html
總結
以上是生活随笔為你收集整理的Mysql分析排序和锁阅读总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1. VIM 系列 - 简单入门,拾起兴
- 下一篇: 快读代码