mysql索引之七:組合索引中選擇合適的索引列順序
組合索引(concatenated index):由多個列構成的索引,如create index idx_emp on emp(col1, col2, col3, ……),則我們稱idx_emp索引為組合索引。
在組合索引中有一個重要的概念:引導列(leading column),在上面的例子中,col1列為引導列。當我們進行查詢時可以使用”where col1 = ? ”,也可以使用”where col1 = ? and col2 = ?”,這樣的限制條件都會使用索引,但是”where col2 = ? ”查詢就不會使用該索引。所以限制條件中包含先導列時,該限制條件才會使用該組合索引。
建立2張測試表:
mysql> desc test1; +-------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+-------+ | id | int(11) | NO | | NULL | | | name | varchar(45) | YES | MUL | NULL || | dept | varchar(50) | YES | | NULL | | | desc | varchar(100) | YES | | NULL | | +-------+--------------+------+-----+---------+-------+ 4 rows in set (0.00 sec) mysql> desc test2; +---------+-------------+------+-----+---------+-------+ | Field | Type |Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | email | varchar(50) | YES | | NULL | | | address | varchar(50) | YES | | NULL | | +---------+-------------+------+-----+---------+-------+ 3 rows in set (0.00 sec) mysql>
通過儲存過程模擬一些資料:
delimiter $$ create procedure mock_insert_test1() BEGIN DECLARE v int DEFAULT 1; WHILE v < 800000 DO INSERT into test1 VALUES(v,CONCAT('name',v),CONCAT('dept',v),NULL); SET v = v + 1; END WHILE; end $$ delimiter ; delimiter $$ create procedure mock_insert_test2() BEGIN DECLARE v int DEFAULT 1; WHILE v < 800000 DO INSERT into test2 VALUES(v,CONCAT('email',v),CONCAT('addr',v)); SET v = v + 1; END WHILE; end $$ delimiter ;
執行儲存過程灌一些資料,
mysql> SELECT * from test1 limit 10; +----+----------+-------+------+ | id | name | dept | desc | +----+----------+-------+------+ | 1 | duan | yanfa | NULL | | 2 | zhangsan | renli | NULL | | 3 | lisi | renli | NULL | | 1 | name1 | dept1 | NULL | | 2 | name2 | dept2 | NULL | | 3 | name3 | dept3 | NULL | | 4 | name4 | dept4 | NULL | | 5 | name5 | dept5 | NULL | | 6 | name6 | dept6 | NULL | | 7 | name7 | dept7 | NULL | +----+----------+-------+------+ 10 rows in set (0.00 sec) mysql>
引導列是id時,索引是這樣的:inx_id_name:id,name
建立索引後,
結果:
引導列是name時,索引是這樣的:
結果:
為什麼要以name為引導列?因為ID是join列,並且ID列上面沒過濾條件,如果以ID列作為引導列,由於沒過濾條件那麼CBO只能走 index full scan,或者index fast full scan,因為引導列沒過濾條件,走不了index range scan, 最多走index skip scan,不過index skip scan代價過高,因為index skip scan要求 引導列選擇性很低,但是ID這裡選擇性很高。
如果name列作為引導列,那麼優化器就可以選擇index range scan,這樣相比index full scan, index fast full scan肯定要少掃描很多leaf block,邏輯讀就會相對較少。
其實到這裡,是否可以總結一下建立組合索引的原則總結:
- 引導列要選擇過濾條件的列作為引導列,比如 where a.xxx='xxx' 或者 a.xxx> 或者 a.xxx<
- 引導列的選擇性越高越好,因為選擇性越高,掃描的leaf block就越少,效率就越高 (正確的順序依賴於使用該索引的查詢,並且同時需要考慮如何更好的滿足排序和分組的需要。在一個多列B-Tree索引中,索引列的順序意味著索引首先按照最左列進行排序,其次是第二列。所以,索引可以按照升序或者降序進行掃描,以滿足精確符合列順序的ORDER BY、GROUP BY和DISTINCT等子句的查詢需求。對於如何選擇索引順序有一個經驗法則:將選擇性較高的列放到索引的最前列。)
- 儘量把join列放到組合索引最後面
相關推薦
mysql索引之七:組合索引中選擇合適的索引列順序
組合索引(concatenated index):由多個列構成的索引,如create index idx_emp on emp(col1, col2, col3, ……),則我們稱idx_emp索引為組合索引。 在組合索引中有一個重要的概念:引導列(leading column),在上面的例子中,col1列
C語言學習及應用筆記之七:C語言中的回撥函式及使用方式
我們在使用C語言實現相對複雜的軟體開發時,經常會碰到使用回撥函式的問題。但是回撥函式的理解和使用卻不是一件簡單的事,在本篇我們根據我們個人的理解和應用經驗對回撥函式做簡要的分析。 1、什麼是回撥函式 既然談到了回撥函式,首先我們就要搞清楚什麼是回撥函式。在討論回撥函式之前,我們需要說明另一個概念,
Linux ALSA音效卡驅動之七:ASoC架構中的Codec
1. Codec簡介 在移動裝置中,Codec的作用可以歸結為4種,分別是: 對PCM等訊號進行D/A轉換,把數字的音訊訊號轉換為模擬訊號對Mic、Linein或者其他輸入源的模擬訊號進行A/D轉換,把模擬的聲音訊號轉變CPU能夠處理的數字訊號對音訊通路進行控制,比如
mysql索引之三:索引使用注意規則(索引失效--存在索引但不使用索引)*
使用索引時,有以下一些技巧和注意事項: (1)越小的資料型別通常更好:越小的資料型別通常在磁碟、記憶體和CPU快取中都需要更少的空間,處理起來更快。(2)簡單的資料型別更好:整型資料比起字元,處理開銷更小,因為字串的比較更復雜。在MySQL中,應該用內建的日期和時間資料型別,而不是用字串來儲存時間;以及用整
信息摘要算法之七:SHA在區塊鏈中的應用
產生 transacti 如何 OS bit 包含 分享圖片 整數 its 最近幾年比特幣的火爆帶動了人們對區塊鏈技術的研究。當然我們在這裏並不討論區塊鏈技術本身,而是討論一下區塊鏈中的SHA算法的應用。對於SHA系列算法我們已經在前面作了說明,在這裏也不再重復。 1、區塊
mysql數據庫優化之 如何選擇合適的列建立索引
索引 taf order 誰的 bsp 選擇 spa mysql 查詢 1. 在where 從句,group by 從句,order by 從句,on 從句中出現的列; 2. 索引字段越小越好; 3. 離散度大的列放到聯合索引的前面;比如: select * fro
ALSA音效卡驅動中的DAPM詳解之七:dapm事件機制(dapm event)
前面的六篇文章,我們已經討論了dapm關於動態電源管理的有關知識,包括widget的建立和初始化,widget之間的連線以及widget的上下電順序等等。本章我們準備討論dapm框架中的另一個機制:事件機制。通過dapm事件機制,widget可以對它所關心的dapm事
資料結構實驗之連結串列七:單鏈表中重複元素的刪除(SDUT 2122)
#include <bits/stdc++.h> using namespace std; typedef struct node { int data; struct no
SDUT OJ 2122 資料結構實驗之連結串列七:單鏈表中重複元素的刪除
#include<iostream> #include<stdlib.h> using namespace std; typedef int ElemType; typedef struct LNode { ElemType data; stru
2122=數據結構實驗之鏈表七:單鏈表中重復元素的刪除
eof n) stdio.h for div printf code main 元素 1 #include <stdio.h> 2 #include <stdlib.h> 3 struct node 4 { 5 int
Unity3d修煉之路:遊戲開發中,3d數學知識的練習【1】(不斷更新.......)
turn tor rdo pre 長度 scrip 縮放 unity3d float #pragma strict public var m_pA : Vector3 = new Vector3(2.0f, 4.0f, 0.0f); public var m_pB :
【深入Java虛擬機】之七:Javac編譯與JIT編譯
p s ots 基本 關鍵字 目前 關註 script 和數 語言 轉載請註明出處:http://blog.csdn.net/ns_code/article/details/18009455 編譯過程 不論是物理機還是虛擬機,大部分的程序代碼從開始編譯到最終轉化
轉:【Java並發編程】之七:使用synchronized獲取互斥鎖的幾點說明
相互 strong enter 方法 虛擬 get tar 指令 自己 轉載請註明出處:http://blog.csdn.net/ns_code/article/details/17199201 在並發編程中,多線程同時並發訪問的資源叫做臨界資源,當多個線程同時
Linux時間子系統之七:定時器的應用--msleep(),hrtimer_nanosleep()
get 關系 警告 mov signed num wakeup sch switch 我們已經在前面幾章介紹了低分辨率定時器和高精度定時器的實現原理,內核為了方便其它子系統,在時間子系統中提供了一些用於延時或調度的API,例如msleep,hrtimer_nanosleep
設計模式之八:組合模式(Composite Pattern)
數據結構 log ide ase 統一 etc 方法 可能 模式 什麽是組合模式呢?簡單來說組合模式就是將對象合成樹形結構以表示“部分整體”的層次結構,組合模式使用戶對單個對象和組合對象使用具有一致性。 組合模式(Composite Pattern)有時
萬惡之源:C語言中的隱式函數聲明
article ror 簡單的 .text parent ble spl return 影響 1 什麽是C語言的隱式函數聲明 在C語言中,函數在調用前不一定非要聲明。如果沒有聲明,那麽編譯器會自己主動依照一種隱式聲明的規則,為調用函數的C代碼產生匯編代
Modbus庫開發筆記之七:Modbus其他輔助功能開發
puts sin weak oid 數據格式 _weak 解析 但是 大端 前面開發了各種應用,但是卻一直沒有提到一個問題,你就是對具體的數據進行讀寫操作。對於Modbus來說標準的數據有4種:線圈數據(地址:0000x)、輸入狀態量數據(地址:1000x)、保持寄存器數據
Net分布式系統之七:日誌采集系統(1)
高並發 log4 並發 自動化 發送 高可用性 微信 預警 div 日誌對大型應用系統或者平臺尤其重要,系統日誌采集、分析是系統運維、維護及用戶分析的基礎。 一、系統日誌分類 一般系統日誌可分為三大類: 1、用戶行為日誌:通過采集系統用戶使用系統過程中,一
Net分布式系統之七:日誌采集系統(1)(轉)
常見 數據抽取 htm elastics nbsp 調用 res 化運維 分布式系統 http://www.cnblogs.com/Andon_liu/p/7508107.html 日誌對大型應用系統或者平臺尤其重要,系統日誌采集、分析是系統運維、維護及用戶分析的基礎。
Office 365 系列之七:安裝 Office 365 ProPlus
office365 安裝office 安裝在線office 在前幾篇文章中已經完成了O365用戶的手動創建和批量導入並分配對應的許可。既然用戶已經具備使用這個服務的許可了,今天我們就一起來看看如何去使用O365,和本地的Office又有何差別,然後介紹使用即點即用技術安裝 Office 3