假如,乙個**薄裡面包含了乙個城市的所有人的姓名和**號碼。那麼,想找到bob cat的**號碼,另外我們知道**簿中名字是按照字母順序排列的,所以首先要查詢姓氏為cat的頁面,然後在這個頁面下查詢名字為bob的**號碼。
那如果在**薄中的名字沒有按照字母排列,就需要去瀏覽所有的頁,然後在裡面查詢每個姓名直到找到bob cat,這種是查詢了所有的**頁,所以在時間上還是挺費時的。
那我們將**簿與資料庫表聯絡起來,如果有乙個**簿表然後要找到bob cat的**號碼,則可以執行以下查詢:
select
phone_number
from
phone_book
where
first_name = 'bob' and
last_name = 'cat';
這個寫起來很容易,在資料量不大的時候查詢速度很快,但資料庫必須掃瞄表的所有行,直到找到該行為止,如果表有數百萬行而沒有索引時,則檢索資料會耗費很多的時間。
索引是一種資料結構,例如b-tree,這種資料結構是需要額外的寫入和儲存為代價來提高表上資料檢索的速度。一旦建立了索引後,資料庫中查詢優化器使用索引來快速定位資料,然後就無需掃瞄表中給定查詢的每一行了。
其中。當使用主鍵或唯一鍵建立表時,mysql會自動建立名為primary的特殊索引, 該索引稱為聚簇索引。primary索引是比較特殊的,這個索引本身與資料一起儲存在同乙個表中。另外除primary索引之外的其他索引稱為二級索引或非聚簇索引。
通常,建立表的時候就能為表建立索引。 例如,以下語句建立乙個新錶,並建立了是由兩列c2和c3組成的索引。
create table t(
c1 int primary key,
c2 int not null,
c3 int not null,
c4 varchar(10),
index (c2,c3)
);
但是要為列或一組列新增索引,可以使用create index語句,如下所示:
create index index_name on table_name (column_list)
要為列建立索引,要指定索引名稱,索引所屬的表以及列。
例如,要為列c4新增新索引,請使用以下語句:
create index idx_c4 on t(c4);
預設情況下,如果未指定索引型別,mysql將建立b-tree索引。 以下顯示了基於表的儲存引擎的允許索引型別:
以下語句查詢職位為sales rep的員工:
這裡資料返回了17行,表明17名員工的職位是銷售代表。
那我們要檢視mysql如何在內部執行此查詢,可以在select語句的開頭新增explain子句,會得到下面的結果:
可以看到,mysql必須掃瞄包含23行的整個表,以查詢具有sales rep職位的員工。
現在,讓我們使用create index語句為jobtitle列建立乙個索引:
create index jobtitle on employees(jobtitle);
並再次執行上述語句:
explain select
employeenumber,
lastname,
firstname
from
employees
where
jobtitle = 'sales rep';
這時候看到,mysql只需要在鍵列中指示的jobtitle索引中找到17行而不掃瞄整個表。
如果要顯示表的索引,可以使用下show indexes語句,例如:
show indexes from employees;
返回結果如下的索引
翻譯參考:
1.mysql建立索引
2.文章使用的資料來源
建立二級索引 InnoDB索引
聚簇索引 二級索引 聯合索引 innodb的b 數索引的注意事項 索引的一些結論 索引的代價 覆蓋索引 如何挑選索引?主鍵插入順序 b 樹索引在空間和時間上都有代價,不要亂建索引!b 樹索引適用於下邊這些情況 b 樹索引不能用下邊這些情況 asc desc混用 不能高效地利用索引 where子句 現...
mysql二級索引
聚集索引葉子節點存放記錄 非聚集索引葉子節點存放key和主鍵資訊 二級索引查詢比聚集索引慢,需要回表 iot表 拆表人肉回表 myisam索引是堆表 也是有序的 myisam主鍵和唯一索引的效率相當,不需要再回表 資料檔案位址修改了,iot不需要修改 myisam適合讀的應用 innodb適合寫 i...
mysql索引,雜湊索引,聚集索引,二級索引
雜湊索引 雜湊索引,只有精確匹配索引所有列的查詢才有效,對於每一行資料,儲存引擎都會對所有的索引計算乙個雜湊碼。雜湊索引將所有的雜湊碼儲存在索引中,同時在雜湊表中儲存指向每個資料行的指標。如果多個列的雜湊值相同,索引會以鍊錶的方式存放多個指標記錄到同乙個雜湊條目中。因為索引自身只儲存對應的雜湊值,所...