先建立一張資料庫表:
create table single_table( id int not auto_increment, key1 varchar(100), key2 int, key3 varchar(100), key_part1 varchar(100), key_part2 varchar(100), key_part3 varchar(100), common_field varchar(100), primary key(id), # 聚簇索引 key idx_key1(key1), # 二级索引 unique key uk_key2(key2), # 二级索引,而且该索引是唯一二级索引 key idx_key3(key3), # 二级索引 key idx_key_part(key_part1,key_part2,key_part3) # 二级索引,也是联合索引 )Engine=InnoDB CHARSET=utf8;
1、索引用來減少需要掃描的記錄數量
最基本的查詢執行方案是掃描表中所有記錄,檢查每筆搜尋記錄是否符合搜尋條件。如果符合,就將其傳送到客戶端,否則就跳過該記錄。這種執行方案稱為全表掃描。
對於InnoDB
儲存引擎來說,全表掃描意味著從叢集索引第一個葉子節點的第一筆記錄開始,沿著記錄所在的單向鍊錶向後掃描,直到最後一個葉子節點的最後一筆記錄,如果可以利用B 樹來尋找索引列值等於某個值的記錄,這樣就可以減少需要掃描的記錄的數量。
由於B 樹葉子節點中的記錄是按照索引列值有小到大的順序排序的,所以只需要掃描某個區間或某些區間中的記錄也可以明顯減少需要掃描的記錄的數量。
對於查詢語句:
select * from single_table where id>=2 and id<=100;
這個語句其實就是想找出id
值在[2,100]
區間中的所有叢集索引記錄,我們可以透過叢集索引對應的B 樹快速的找到id=2
的那條叢集索引記錄,然後沿著記錄所在的單向鍊錶向後掃描,直到某條聚簇索引記錄的id
值不在[2,100]
區間中為止,與掃描全部的叢集索引記錄相比,這種方式大幅減少了需要掃描的記錄數量,所以提升了查詢效率。
其實,對於B 樹來說,只要索引列和常數使用=、、in、not in、is null、is not null、>、操作子連接起來,就可以產生掃描區間,進而提高查詢效率。
2、索引用來排序
我們在寫查詢語句時,常常需要使用order by
子句對查詢出來的記錄依照某種規則進行排序。在一般情況下,我們只能把記錄載入到記憶體中,然後再用一些排序演算法在記憶體中對這些記錄進行排序。有時查詢的結果集可能太大以至於在記憶體中無法進行排序,此時就需要暫時藉助磁碟的空間來存放中間結果,在排序作業完成後再把排序的結果傳回給客戶端。
在MySQL中,這種在記憶體中或磁碟中進行排序的方式稱為檔案排序,但是如果order by
子句中使用了索引列,就有可能省去在記憶體或磁碟中排序的步驟。
1、分析下面的查詢語句:
select * form single_table order by key_part1,key_part2,key_part3 limit 10;
這個查詢語句的結果集需要先依照key_part1
值排序,如果記錄的key_part1
值相同,再依照key_part2
值排序,如果key_part1
值和key_part2
值都相同,再依照key_part3
排序。而我們建立的聯合索引idx_key_part
就是依照上面的規則排序的,如下為idx_key_part
索引的簡化示意圖:
所以我們可以從第一筆idx_key_part
二級索引記錄開始,沿著記錄所在的單向鍊錶向後掃描,取10筆二級索引記錄即可。由於我們的查詢清單是*
,也就是需要讀取完整的使用者記錄,所以針對獲取到的每個二級索引記錄都執行一次回表操作,將完整的使用者記錄傳送給客戶端。這樣就省去了給10000筆記錄排序的時間。
這裡我們在執行查詢語句時加了limit語句,如果不限制需要取得的記錄數量,會導致為大量二級索引記錄執行回表操作,這樣會影響整體的效能。
2、使用聯合索引進行排序時的注意事項
在使用聯合索引時,需要注意:order by
子句後面的列的順序也必須按照索引列的順序給出;如果給予order by key_part3,key_part2,key_part1
的順序,則無法使用B 樹索引。
之所以顛倒排序列順序就不能使用索引,原因還是聯合索引中頁面和記錄的排序規則是規定的,即先按照key_part1
值排序,如果記錄的key_part1
值相同,再依照key_part2
值排序,如果記錄的key_part1
值和key_part2
值都相同,再依照key_part3
值排序。如果order by
子句的內容是order by key_part3,key_part2,key_part1
,那就要求先依照key_part3
值排序,如果記錄的key_part3
值相同,再依照key_part2
值排序,如果記錄的key_part3
值和key_part2
值都相同,再依照key_part1
值排序,這顯然是衝突的。
3、不可以使用索引进行排序的情况:
(1) ASC、DESC
混用;
对于使用联合索引进行排序的场景,我们要求各个排序列的排序规则是一致的,也就是要么各个列都是按照升序规则排序,要么都是按照降序规则排序。
(2) 排序列包含非一个索引的列;
有时用来排序的多个列不是同一个索引中的,这种情况也不能使用索引进行排序,比如下面的查询语句:
select * from single_table order by key1,,key2 limit 10;
对于idx_key1
的二级索引记录来说,只按照key1
列的值进行排序,而且在key1
列相同的情况下是不按照
key2
列的值进行排序的,所以不能使用idx_key1
索引执行上述查询。
(3) 排序列是某个联合索引的索引列,但是这些排序列在联合索引中并不连续;
(4) 排序列不是以单独列名的形式出现在order by
子句中;
3、索引用于分组
有时为了方便统计表中的一些信息,会把表中的记录按照某些列进行分组。比如下面的分组查询语句:
select key_part1,key_part2,key_part3,count(*) fron single_table group by key_part1,key_part2,key_part3;
这个查询语句相当于执行了3次分组操作:
先按照
key_part1
值把记录进行分组,key_part1
值相同的所有记录划分为一组;将
key_part1
值相同的每个分组中的记录再按照key_part2
的值进行分组,将key_part2
值相同的记录放到一个小分组中,看起来像是在一个大分组中又细分了好多小分组。再将上一步中产生的小分组按照
key_part3
的值分成更小的分组。所以整体上看起来就像是先把记录分成一个大分组,然后再把大分组分成若干个小分组,最后把若干个小分组再细分为更多的小分组。
上面这个查询语句就是统计每个小小分组包含的记录条数。
如果没有idx_key_part
索引,就得建立一个用于统计的临时表,在扫描聚簇索引的记录时将统计的中间结果填入这个临时表。当扫描完记录后,再把临时表中的结果作为结果集发送给客户端。
如果有了idx_key_part
索引,恰巧这个分组顺序又与idx_key_part
的索引列的顺序一致,因此可以直接使用idx_key_part
的二级索引进行分组,而不用建立临时表了。
与使用B+树索引进行排序差不多,分组列的顺序页需要与索引列的顺序一致,也可以值使用索引列中左边连续的列进行分组。
以上是MySQL索引的作用是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

MySQL使用的是GPL許可證。 1)GPL許可證允許自由使用、修改和分發MySQL,但修改後的分發需遵循GPL。 2)商業許可證可避免公開修改,適合需要保密的商業應用。

選擇InnoDB而不是MyISAM的情況包括:1)需要事務支持,2)高並發環境,3)需要高數據一致性;反之,選擇MyISAM的情況包括:1)主要是讀操作,2)不需要事務支持。 InnoDB適合需要高數據一致性和事務處理的應用,如電商平台,而MyISAM適合讀密集型且無需事務的應用,如博客系統。

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

MySQL中有四種主要的索引類型:B-Tree索引、哈希索引、全文索引和空間索引。 1.B-Tree索引適用於範圍查詢、排序和分組,適合在employees表的name列上創建。 2.哈希索引適用於等值查詢,適合在MEMORY存儲引擎的hash_table表的id列上創建。 3.全文索引用於文本搜索,適合在articles表的content列上創建。 4.空間索引用於地理空間查詢,適合在locations表的geom列上創建。

toCreateAnIndexinMysql,usethecReateIndexStatement.1)forasingLecolumn,使用“ createIndexIdx_lastNameEnemployees(lastName); 2)foracompositeIndex,使用“ createIndexIndexIndexIndexIndexDx_nameOmplayees(lastName,firstName,firstName);” 3)forauniqe instex,creationexexexexex,

MySQL和SQLite的主要區別在於設計理念和使用場景:1.MySQL適用於大型應用和企業級解決方案,支持高性能和高並發;2.SQLite適合移動應用和桌面軟件,輕量級且易於嵌入。

MySQL中的索引是數據庫表中一列或多列的有序結構,用於加速數據檢索。 1)索引通過減少掃描數據量提升查詢速度。 2)B-Tree索引利用平衡樹結構,適合範圍查詢和排序。 3)創建索引使用CREATEINDEX語句,如CREATEINDEXidx_customer_idONorders(customer_id)。 4)複合索引可優化多列查詢,如CREATEINDEXidx_customer_orderONorders(customer_id,order_date)。 5)使用EXPLAIN分析查詢計劃,避

在MySQL中使用事務可以確保數據一致性。 1)通過STARTTRANSACTION開始事務,執行SQL操作後用COMMIT提交或ROLLBACK回滾。 2)使用SAVEPOINT可以設置保存點,允許部分回滾。 3)性能優化建議包括縮短事務時間、避免大規模查詢和合理使用隔離級別。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

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

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

WebStorm Mac版
好用的JavaScript開發工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

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