MySQL索引及優化的知識點有哪些
索引是什麼?
索引是幫助MySQL進行高效率查詢的一種資料結構。好比一本書的目錄,能加快查詢的速度
#索引的結構?
索引可以有B-Tree索引,Hash索引。索引是在儲存引擎中實現的
InnoDB / MyISAM 僅支援B-Tree索引
Memory/Heap 支援B-Tree索引和Hash索引
-
#B-Tree
B-Tree是一種非常適合用於磁碟操作的資料結構。它是一棵多路平衡查找樹。其高度一般在2-4,其非葉子節點,葉子節點,都會儲存資料。其所有的葉子節點,都在同一層。下圖是一顆B-Tree
# B Tree:B 樹是在B-Tree基礎上的一種最佳化.它和B樹的主要區別在於:B 樹的資料全部儲存在葉子節點中,且葉子節點被一個鍊錶串了起來。下圖是一顆B 樹
InnoDB中一個頁的大小為16KB(一個頁即B 樹上的節點),若表的主鍵為INT,大小為4位元組,那一個節點也能夠儲存4K個鍵值,假設指標和鍵值都佔相同大小,那麼高度為3的B 樹,第二層有2048個節點,第三層的葉子節點數為2048*2048 = 4194304,一個節點為16KB,則總共可容納67108864KB,即65536MB,即64G的資料。
由於葉子節點是被一個鍊錶串起來的,所以若order by 索引列,則預設已經是排好序的,所以效率會很高。
MyISAM索引
MyISAM的索引和資料是分開存放的。在MyISAM的主鍵索引中,B 樹葉子節點裡,存的是記錄的位址,故MyISAM透過索引查詢,需要經過2次IO
InnoDB索引
- InnoDB的資料和索引是存放在一起的,又稱為聚集索引。資料透過主鍵索引,存放在主鍵索引B 樹的葉子節點上。
- InnoDB主鍵索引,資料已經包含在了葉子節點中,即索引和資料存放在一起,是為聚集索引。
- InnoDB的輔助索引,葉子節點中存的是主鍵值,而不是位址。走輔助索引,需要檢索2次。
InnoDB和MyISAM索引的區別: InnoDB使用聚集索引,其主鍵索引葉子節點中直接儲存了數據,而其輔助索引中葉子節點存的是主鍵的值
- 問題 :
- InnoDB為什麼不使用過長的欄位做主鍵
?
過長的主鍵,會使得輔助索引所佔空間變得很大 - #為什麼推薦InnoDB使用自增主鍵 ?
- 若使用自增主鍵,則每次插入新的記錄,就會順序的將新記錄添加到當前索引節點的後續位置,一頁寫滿了,才會進行開闢新的一頁,這樣使得索引結構很緊湊,且每次插入時不需要移動已有數據,非常有效率。而如果不使用自增主鍵,則每次插入新記錄時,都要選擇一個插入位置,並且可能需要移動數據,使得效率不高,且索引結構不緊湊
- 為什麼要用B 樹,不用B樹#########存在哪一個存在哪? ############索引本身也比較大,通常會儲存在磁碟中,索引和資料可能是分開存放的(MyISAM的非聚集索引),也可能是一起存放的(InnoDB的聚集索引)############索引的優缺點?###########################降低IO成本,提高資料查詢效率############降低排序成本(被索引的列會自動排序,使用order by 效率會提高很多)############ ###缺點###
索引會額外佔據儲存空間
#索引會降低更新表資料的效率。進行增刪改操作時,不僅要保存數據,還要更新對應的索引
#索引的分類
- ##單列索引
- 主鍵索引
- 唯一索引
- 普通索引
- #組合索引
- 建立索引
CREATE INDEX index_name ON table_name(col_name); -- 或者 ALTER TABLE table_name ADD INDEX index_name(col_name)
- 刪除索引
DROP INDEX index_name ON table_name;
- 需要建立索引的場景
- 頻繁作為查詢條件的列,需建索引
- 多表關聯中,關聯字段需建置索引 ##查詢中排序的字段,需建立索引
- 頻繁更新的字段,不適合用於建索引
- #寫入多讀少的表,不適合用於建立索引
現有一張user表,其索引如下所示
其中name,age,address 三個欄位作為一個組合索引
可以使用explain對某個SQL語句進行效能分析
explain select * from user where name = 'am';
#可能用到的索引
key
實際用到的索引
key_len
用於查詢的索引的長度
ref
#如果是等值查詢,這裡會是const
rows
預計需要掃描的行數(不是精確值)
extra
#額外信息,如
- using where
- 表示儲存引擎傳回的結果,還需要在SQL Layer層過濾
- 表示不需要回表查詢,一般在使用了覆蓋索引時會是這個值。覆蓋索引指的是,select中的列,全是索引列。不需要回表查詢指的是,直接走輔助索引,就能拿到索引列的值,不需要再去主鍵索引上取記錄了
- MySQL 5.6.x之後支援ICP特性(Index Condition Pushdown),可以把檢查條件下推到儲存引擎層,不符合條件的記錄,直接不讀取,而不是像原來一樣,先讀取出來,再在SQL Layer層過濾,這樣減少了儲存引擎層掃描的行數
- #using filesort
- 排序時無法用到索引
- : 表中只有1行數據,或空表
- const : 使用唯一索引或主鍵索引,且用where等值查詢,傳回記錄是1行,又叫唯一索引掃描
- ref : 針對非唯一索引,使用等值where條件,或最左前綴規則的查詢。
- 以下是滿足了最左前綴規則,也就是對idx_name_age_add來說,滿足了最左前綴,第一個索引為name
- range:索引範圍掃描,常見於>,<,between,in,like等查詢
注意like時,通配符%不能放在開頭,否則會導致全表掃描
索引使用规范(索引失效分析)
全值匹配
在索引列上使用等值查询
explain select * from user where name = 'y' and age = 15;
2. 最左前缀
组合索引中,查询条件要从组合索引的最左列开始,如上述example中组合索引idx_name_age_add,是建立在三个列name,age,address的,若跳过name,直接用age查询,则会变为全表扫描
explain select * from user where age = 15;
3. 不要在索引列上做计算
4. 范围条件右侧的索引列会失效
看到第一个SQL语句,没有用上addresss索引
5. 尽量使用覆盖索引
explain select name,age from user where name = 'y' and age = 1;
可以避免回表查询
6. 索引字段不要使用不等(!= 或 ),不要判断null(is null/ is not null)
会导致索引失效,转为全表扫描
7. 索引字段上使用like时,不要以%开头
8. 索引字段如果是字符串,记得加单引号
9. 索引字段不要用or
例子总结:
以上是MySQL索引及優化的知識點有哪些的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Laravel 是一款 PHP 框架,用於輕鬆構建 Web 應用程序。它提供一系列強大的功能,包括:安裝: 使用 Composer 全局安裝 Laravel CLI,並在項目目錄中創建應用程序。路由: 在 routes/web.php 中定義 URL 和處理函數之間的關係。視圖: 在 resources/views 中創建視圖以呈現應用程序的界面。數據庫集成: 提供與 MySQL 等數據庫的開箱即用集成,並使用遷移來創建和修改表。模型和控制器: 模型表示數據庫實體,控制器處理 HTTP 請求。

MySQL和phpMyAdmin是強大的數據庫管理工具。 1)MySQL用於創建數據庫和表、執行DML和SQL查詢。 2)phpMyAdmin提供直觀界面進行數據庫管理、表結構管理、數據操作和用戶權限管理。

MySQL与其他编程语言相比,主要用于存储和管理数据,而其他语言如Python、Java、C 则用于逻辑处理和应用开发。MySQL以其高性能、可扩展性和跨平台支持著称,适合数据管理需求,而其他语言在各自领域如数据分析、企业应用和系统编程中各有优势。

文章摘要:本文提供了詳細分步說明,指導讀者如何輕鬆安裝 Laravel 框架。 Laravel 是一個功能強大的 PHP 框架,它 упростил 和加快了 web 應用程序的開發過程。本教程涵蓋了從系統要求到配置數據庫和設置路由等各個方面的安裝過程。通過遵循這些步驟,讀者可以快速高效地為他們的 Laravel 項目打下堅實的基礎。

在MySQL中,外鍵的作用是建立表與表之間的關係,確保數據的一致性和完整性。外鍵通過引用完整性檢查和級聯操作維護數據的有效性,使用時需注意性能優化和避免常見錯誤。

MySQL和MariaDB的主要區別在於性能、功能和許可證:1.MySQL由Oracle開發,MariaDB是其分支。 2.MariaDB在高負載環境中性能可能更好。 3.MariaDB提供了更多的存儲引擎和功能。 4.MySQL採用雙重許可證,MariaDB完全開源。選擇時應考慮現有基礎設施、性能需求、功能需求和許可證成本。

MySQL和phpMyAdmin可以通過以下步驟進行有效管理:1.創建和刪除數據庫:在phpMyAdmin中點擊幾下即可完成。 2.管理表:可以創建表、修改結構、添加索引。 3.數據操作:支持插入、更新、刪除數據和執行SQL查詢。 4.導入導出數據:支持SQL、CSV、XML等格式。 5.優化和監控:使用OPTIMIZETABLE命令優化表,並利用查詢分析器和監控工具解決性能問題。

SQL是一種用於管理關係數據庫的標準語言,而MySQL是一個使用SQL的數據庫管理系統。 SQL定義了與數據庫交互的方式,包括CRUD操作,而MySQL實現了SQL標準並提供了額外的功能,如存儲過程和触發器。
