Mysql簡易索引
一、沒有索引的時候如何找出
先忽略掉索引這個概念,如果現在直接要查某筆記錄,要如何找呢?
在一個頁面中找出
如果表中的記錄很少,一個頁就夠放,那麼這時候有2 種情況:
用主鍵為搜尋條件:這時就是先前文章提過的方式,頁面目錄中用二分法快速定位到槽,然後遍歷該槽對應分組的記錄,最終找到指定記錄。
用其他非主鍵的列為搜尋條件:因為資料頁中沒有為非主鍵列建立頁目錄,無法透過二分法快速定位槽,只能從Infimum 記錄開始一次遍歷單鍊錶的每筆記錄,效率低。
在很多頁中查找
當表中的記錄非常多,就會用到很多的資料頁來存儲,這時候需要2 個步驟:
定位到記錄所在頁面。
重複上述在一個頁面中尋找的過程。
總得來說,當沒有索引,我們無法快速定位到記錄所在頁,只能從第一頁沿著雙向鍊錶(頁有前一頁和後一頁)一直找下去,然後在每一頁中重複上述的過程查詢指定的記錄,需要遍歷所有記錄,這種方式非常耗時。
二、一個簡易索引
既然是因為頁數太多導致定位記錄太慢,那該如何解決呢?不妨參考一下「頁目錄」。
頁目錄就是為了根據主鍵快速定位一筆記錄在頁中的位置而設定的。因此,我們可以探討一種方法,即建立一個「其他目錄」來快速定位記錄所在的頁面。
但是這個「別的目錄」要想完成還得乾好 2 件事。
1. 下一頁使用者記錄的主鍵值必須大於上一頁的
假設,每個資料頁最多可以放3 筆記錄(實際上可以放很多),那麼現在向表裡插入3 筆記錄,每筆記錄有3個列c1、c2、c3。為了看著方便,儲存行格式也簡化下,只留關鍵屬性。虛擬記錄Infimum和Supremum分別位於使用者記錄的首尾,中間有3筆使用者記錄。
此時,繼續插入 1 筆記錄。在假設的情況下,需要至少分配一個新頁面,因此這兩個頁面將被重新分配並重新排列。
請注意紅色字體顯示的兩筆記錄,其中包含了一個新插入的主鍵為 4 的記錄,應該被放在新頁上。但是,為了滿足下一頁使用者記錄的主鍵值必須大於上一頁的使用者記錄主鍵值,做了諸如記錄移動的操作,這個過程也可以稱為「頁分裂」。
另外,為什麼新頁是頁 28,而不是 11?因為頁在磁碟上可能並不挨著,它們只是透過維護上一頁和下一頁的編號而建立了鍊錶關係。
2. 給所有的頁建立一個目錄項目
現在繼續向表裡增加數據,最終多個頁的關係是這樣:
為了從多個不相鄰的頁面快速定位某個記錄,需要為它們編制一個目錄,因為這些頁面在磁碟上可能不是連續的。
每個頁對應一個目錄項,每個目錄項包含:
- 頁的使用者記錄的使用者記錄中最小的主鍵值,用key 來表示
頁號,用page_no 表示
那麼,現在我想查找主鍵值為20 的記錄,具體就分兩步走:
利用二分法從目錄項中快速確定主鍵值為20 的記錄在目錄項3,且它所在的頁碼為9。知道是在頁 9,重複之前的方式,找到最終目標記錄。
到此,一個簡易的方案完成。而完成的這個簡易目錄,它有個別名,叫做索引。
三、簡易索引暴露出的問題
上述的簡易索引是原書作者為了循序漸進的幫助讀者理解而設定的內容,這並不是innodb的索引方案。
那麼針對上述的建議索引,看下有哪些問題。
###問題一:######InnoDB 使用頁面作為管理儲存空間的基本單位,也就是最多只能保存16kb的連續儲存。 ######當表中記錄越來越多,此時就需要非常大的連續儲存空間才可以把所有的目錄項目都裝下,這對大數據量的表來說不切實際。 ###問題二:
我們常常還要對記錄執行增刪改操作,會牽一發而動全身。
例如,上圖中我如果把頁 28 中的記錄都刪除,那麼頁 28 就沒必要存在,進而目錄項目 2 也沒必要存在。這時候就需要把目錄項 2 後的目錄項都往前移動。
就算不移動,把目錄項目 2 作為冗餘放在目錄項目清單中,仍然會浪費很多的儲存空間。
以上是Mysql簡易索引方案分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

ACID屬性包括原子性、一致性、隔離性和持久性,是數據庫設計的基石。 1.原子性確保事務要么完全成功,要么完全失敗。 2.一致性保證數據庫在事務前後保持一致狀態。 3.隔離性確保事務之間互不干擾。 4.持久性確保事務提交後數據永久保存。

MySQL既是數據庫管理系統(DBMS),也與編程語言緊密相關。 1)作為DBMS,MySQL用於存儲、組織和檢索數據,優化索引可提高查詢性能。 2)通過SQL與編程語言結合,嵌入在如Python中,使用ORM工具如SQLAlchemy可簡化操作。 3)性能優化包括索引、查詢、緩存、分庫分錶和事務管理。

MySQL使用SQL命令管理數據。 1.基本命令包括SELECT、INSERT、UPDATE和DELETE。 2.高級用法涉及JOIN、子查詢和聚合函數。 3.常見錯誤有語法、邏輯和性能問題。 4.優化技巧包括使用索引、避免SELECT*和使用LIMIT。

MySQL是一種高效的關係型數據庫管理系統,適用於存儲和管理數據。其優勢包括高性能查詢、靈活的事務處理和豐富的數據類型。實際應用中,MySQL常用於電商平台、社交網絡和內容管理系統,但需注意性能優化、數據安全和擴展性。

SQL和MySQL的關係是標準語言與具體實現的關係。 1.SQL是用於管理和操作關係數據庫的標準語言,允許進行數據的增、刪、改、查。 2.MySQL是一個具體的數據庫管理系統,使用SQL作為其操作語言,並提供高效的數據存儲和管理。

InnoDB使用redologs和undologs確保數據一致性和可靠性。 1.redologs記錄數據頁修改,確保崩潰恢復和事務持久性。 2.undologs記錄數據原始值,支持事務回滾和MVCC。

EXPLAIN命令的關鍵指標包括type、key、rows和Extra。 1)type反映查詢的訪問類型,值越高效率越高,如const優於ALL。 2)key顯示使用的索引,NULL表示無索引。 3)rows預估掃描行數,影響查詢性能。 4)Extra提供額外信息,如Usingfilesort提示需要優化。

Usingtemporary在MySQL查詢中表示需要創建臨時表,常見於使用DISTINCT、GROUPBY或非索引列的ORDERBY。可以通過優化索引和重寫查詢避免其出現,提升查詢性能。具體來說,Usingtemporary出現在EXPLAIN輸出中時,意味著MySQL需要創建臨時表來處理查詢。這通常發生在以下情況:1)使用DISTINCT或GROUPBY時進行去重或分組;2)ORDERBY包含非索引列時進行排序;3)使用複雜的子查詢或聯接操作。優化方法包括:1)為ORDERBY和GROUPB


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Atom編輯器mac版下載
最受歡迎的的開源編輯器

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

WebStorm Mac版
好用的JavaScript開發工具