1. 程式人生 > >mysql索引之七:組合索引中選擇合適的索引列順序

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,邏輯讀就會相對較少。 

其實到這裡,是否可以總結一下建立組合索引的原則總結:

  1. 引導列要選擇過濾條件的列作為引導列,比如 where a.xxx='xxx' 或者 a.xxx> 或者 a.xxx<  
  2. 引導列的選擇性越高越好,因為選擇性越高,掃描的leaf block就越少,效率就越高  (正確的順序依賴於使用該索引的查詢,並且同時需要考慮如何更好的滿足排序和分組的需要。在一個多列B-Tree索引中,索引列的順序意味著索引首先按照最左列進行排序,其次是第二列。所以,索引可以按照升序或者降序進行掃描,以滿足精確符合列順序的ORDER BY、GROUP BY和DISTINCT等子句的查詢需求。對於如何選擇索引順序有一個經驗法則:將選擇性較高的列放到索引的最前列。)
  3. 儘量把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