天天看點

MySQL執行計劃與索引_mysql的索引和執行計劃

一、mysql的索引

索引是幫助mysql高效擷取資料的資料結構。本質:索引是資料結構

1:索引分類

普通索引:一個索引隻包含單個列,一個表可以有多個單列索引。

唯一索引:索引列的值必須唯一 ,但允許有空值。

複合索引:一個索引包含多個列。

聚集索引:并不是一種單獨的索引類型,而是一種資料存儲方式。innodb磁盤存儲,.ibd資料和索引放在一個檔案夾下。

非聚集索引:不是聚集索引的,就是非聚集索引。

2:文法

檢視索引        show index from table;

建立索引

create [unique] index indexname on table(columnname(length));

alter table 表名 add [unique] index [indexname] on (columnname(length));

删除索引  drop index [indexName] on table;

3:适合建索引

某一列相對來說唯一

經常用來查詢顯示的列

經常用來關聯的列 where 條件中用到的列,以及join on 用到的列

二、mysql的執行計劃

使用explan關鍵字可以知道mysql是如何處理SQL語句的。

id:相同,都不相同,不全部相同。

相同:擷取select的執行順序。執行順序由上到下。

都不相同:如果是子查詢,id序号會遞增,id值越大優先級越高,越先被執行。

不全部相同:id相同的認為一組,從上往下順序執行。在所有組中,id值越大,優先級越高,越先被執行。

select_type:查詢的類型

simple:簡單的SQL語句,不包含union或者子查詢。

primary:查詢中包含任何的子查詢,最外層查詢被标記。

subquery:在select和where中,查詢的任何子查詢。

derived:在from清單中包含子查詢會被标記為derived,mysql會遞歸執行這些子查詢,把結果放到臨時表。

union:若第二個select出現在union之後,則标記為UNION;若UNION包含在from子句的子查詢中,外層select将被标記為derived。

union result:從union表擷取結果的select。

table:查詢來自那張表

type:通路的類型,重要的一個名額,結果從最好到最壞。

system》const》eq_ref>ref>range>index>all,最好達到ref或者range

system:表中隻有一條記錄(等于系統表),這是const類型的特例,平時不會出現,這個可以忽略不計。

const:表示通過索引一次就找到了。用于primary或unique索引。因為隻比對一行資料。

eq_ref:唯一索引掃描,對于每個索引建,表中隻有一條記錄比對。常見于主鍵或唯一索引掃描。

ref:非唯一索引掃描,傳回比對某個單獨值的所有行。

rang:隻檢索給定範圍内的行,使用一個索引來選擇行。key列顯示使用那個索引,一般就是在你的where語句中出現between、、in查詢中。

index:當查詢的結果全為索引列的時候。也是全表掃描的一種。隻不過掃描的全部索引。

all:全表掃描。

注:當出現index和all的時候,就應該去優化SQL語句。

key:實際所用的索引。如果為null,則沒有使用索引。

possible_key:可能用到的key。possible_key有資料,但是不一定會使用key。key有資料,但是不一定會使用possible_key。這兩者比一定都同時出現。

key_len:表示索引使用的位元組數,通過該列查詢使用索引的長度。在不損失精确性的情況下,長度越短越好。

ref:顯示索引的哪一列被使用了,如果可能得話,是一個常數。

rows:根據表的以及索引選用的情況,大緻估算出需要讀取的行數。掃描的行數越少越好。

extra:包含不适合在其他列中顯示,但重要的額外資訊。

mysql的索引和執行計劃

标簽:ref   column   處理   其他   全表掃描   現在   一個   适合   計劃

本條技術文章來源于網際網路,如果無意侵犯您的權益請點選此處回報版權投訴

本文系統來源:https://www.cnblogs.com/orange-time/p/10595619.html