Atitit. 單列索引與多列索引 多個條件的查詢原理與設計實現
1. MySQL只能使用一個索引1
1.1. 最左前綴1
1.2. 從另一方面理解,它相當於我們創建了(firstname,lastname,age)、(firstname,lastname)以及(firstname)這些列組合上的索引。2
2. 一條 sql 可以使用多個索引2
2.1. 什麼是索引合並2
2.2. 使用索引合並有啥收益3
2.3. 具體的索引合並流程 4
3. Referred、4
那麼,如果在firstname、lastname、age這三個列上分別創建單列索引,效果是否和創建一個firstname、lastname、 age的多列索引一樣呢?答案是否定的,兩者完全不同。當我們執行查詢的時候,MySQL只能使用一個索引。如果你有三個單列的索引,MySQL會試圖選擇一個限制最嚴格的索引。但是,即使是限制最嚴格的單列索引,它的限制能力也肯定遠遠低於firstname、lastname、age這三個列上的多列索引。
作者:: 老哇的爪子 Attilax 艾龍, EMAIL:[email protected]
轉載請注明來源: http://www.cnblogs.com/attilax/
多列索引還有另外一個優點,它通過稱為最左前綴(Leftmost Prefixing)的概念體現出來。繼續考慮前面的例子,現在我們有一個firstname、lastname、age列上的多列索引,我們稱這個索引為fname_lname_age。當搜索條件是以下各種列的組合時,MySQL將使用fname_lname_age索引:
* firstname,lastname,age
* firstname,lastname
* firstname
四、
五、
mysql 的索引合並並不是什麼新特性。早在 mysql5.0 版本就已經實現。之所以還寫這篇博文,是因為好多人還一直保留著一條 sql 語句只能使用一個索引的錯誤觀念。本文會通過一些示例來說明如何使用索引合並。
下面我們看下 mysql 文檔中對索引合並的說明:
The Index Merge method is used to retrieve rows with several range scans and to merge their results into one. The merge can produce unions, intersections, or unions-of-intersections of its underlying scans. This access method merges index scans from a single table; it does not merge scans across multiple tables.
根據官方文檔中的說明,我們可以了解到:
1.
索引合並是把幾個索引的范圍掃描合並成一個索引。
2.
3.
索引合並的時候,會對索引進行並集,交集或者先交集再並集操作,以便合並成一個索引。
4.
5.
這些需要合並的索引只能是一個表的。不能對多表進行索引合並。
6.
簡單的說,索引合並,讓一條 sql 可以使用多個索引。對這些索引取交集,並集,或者先取交集再取並集。從而減少從數據表中取數據的次數,提高查詢效率。
在 explain 的 extra 字段中會以下幾種:
·
Using union 索引取並集
·
·
Using sort_union 先對取出的數據按 rowid 排序,然後再取並集
·
·
Using intersect 索引取交集
·
多個條件的查詢建立索引是幾個字段建立一個索引還是還每個字段定義為一個索引_-CSDN論壇-CSDN.NET-中國最大的IT技術社區.html
MySQL 索引合並 一條 sql 可以使用多個索引-SOHU-DBA-微頭條(wtoutiao.com).htm