1、什麼是索引,什麼時候需要使用索引?
索引是通過額外的空間來儲存你需要快速查詢的一些字段,將這些字段按照一定的順序儲存並與原始資料進行對映,這樣如果你要查詢這些欄位就無需去查詢原表(可以肯定的是索引表的資料量肯定比原表小)
索引是提高查詢效能的最佳途徑。
但是索引也有它適用的範圍,通常對於可以預計是小表的話,我們不會去見索引會浪費空間;對於中表或者大表,通過建立合適的索引能夠極大地提高查詢速度;當然對於超大表,不建議建立索引,會浪費太多的儲存空間,會有其他第三方支援,補充一點:對於超大表的話可以考慮用分割槽表。
2、b-tree索引的查詢型別?
mysql資料庫中最常用的引擎是innodb(當然還有myisam這種引擎不怎麼用),一般來說索引的型別指明都是用b-tree索引,該索引的特點有如下:
(1)匹配最左字首:即最左邊的列是要先匹配,才能匹配剩餘的列。
(2)全值匹配
(3)範圍匹配:當用了範圍匹配,在之後的列將不再用索引了
(4)精確匹配某一列,並範圍匹配另外一列:即將2、3結合
(5)只訪問索引查詢:這個特性也就是我們說的覆蓋索引
3、innodb中無雜湊索引,如何利用雜湊索引?
在innodb中是不存在雜湊索引,那麼雜湊索引又如何用,其實並不能叫做雜湊索引,只是用雜湊特性,本質上還是利用b-tree索引。
通常的用法是:針對某個較長的字串,比如儲存了url,值為:
,那麼我們要對url進行建立索引,如果直接建立的話,索引占用的空間太大,可以通過雜湊函式(比如:crc32)將其值對映到乙個固定長度的數值,將該列的值新增表中,並為該列建立索引。這裡面會有乙個問題,那就是可能會存在重複的雜湊值。解決的辦法:
(1)如果能夠容忍重複的情況下,在查詢where條件中,除了附加索引的列的值,還要新增url的值,當重複的時候,就會用url的值來去重。
(2)另外一種方法,是通過64位的雜湊函式來減少重複的概率。
補充一點:針對長文字建立索引的時候,我們也可以考慮取長文字的字首建立索引,參考第5個問題。
4、那些情況下建立的索引列不起作用?
索引列不起作用的情況:
(1)將所有列使用函式等條件,比如:
select actor_id from sakila.actor where actor.id + 1 = 5; //使用了加號
selec … where to_days(current_date)-to_days(date_col)<=10;
(2)範圍查詢之後的索引列不起作用
範圍查詢主要是指< 、>,以及like,注意:對於in 會轉化多個等式,因此仍然可以。
5、字首索引如何建立及其特性,以及如何實現字尾索引?
建立字首索引:
alter table sakila.city_demo add key (city(7))
根據某個字首利用group統計出個數:
select count(*) as cnt, left(city, 3) as pref from sakila.city_demo group by pref order by cnt desc limit 10;
在乙個查詢中計算不同長度的字首的選擇性:
select count(distinct left(city, 3))/count(*) as sel3,count(distinct left(city, 4))/count(*) as sel4 from sakila.city_demo;
6、多列索引中列的排序如何選擇?
對於b-tree的多列索引,採用的是最左列排序,即在設計多列索引的情況,應該將選擇性最高的放到索引的最前列(好處是能夠快速定位到具體的行,不然會存在很多重複的行)
一般選擇的法則:經驗法則,示例如下:
比如針對兩個列:staff_id和cunstom_id列的選擇,通過以下方法:
select count(distinct staff_id)/count(*) as staff_id_selectivity, count(distinct custom_id)/count(*) as customer_id_selectivity,count(*) from payment \g;
如果確認custom_id比staff_id的選擇性更高,則新增如下多列索引:
alter table payment add key(customer_id, staff_id);
7、什麼是覆蓋索引?如何使用覆蓋索引來實現延遲關聯呢?
覆蓋索引:如果在某次查詢中的字段覆蓋了索引中的字段(即:乙個索引包含或者說覆蓋所有要查詢的字段)
之所以要強調覆蓋索引,是因為覆蓋索引的條目數目通常遠小於資料行大小,且索引是按列值順序儲存的(適合group以及相關範圍查詢)
乙個使用延遲關聯中使用了覆蓋索引的例子:
比如:select * from products where actor=」sean carry」 and title like 『%apolo%』\g;
通過explain計畫看到,extra:using where說明沒有使用到索引。
解決方法:新增多列索引(artist, title, pro_id)
select *
from products
join(
select pro_id
from products
where actor=』sean carry』and title like 『%apollo%』
)as t1 on (t1.prod_id=products.prod_id)
分析上面的語句:
可以看到在join中的列全部是我們建立的多列索引的列,因此可以利用覆蓋索引,當我們覆蓋索引查詢到需要的pro_id後,再關聯表查詢便可減少資料量。
8、mysql中有序結果集生成的方式有哪些?索引在其中起什麼作用?
兩種方式:(1)通過排序操作;(2)按索引排序(如果explain中的type:index說明是按索引排序)
9、什麼是冗餘索引?
比如建立了乙個多列索引(a,b),再建立乙個單列索引(a),此時單列索引就是冗餘索引,因為這只是第乙個索引的字首索引;如果建立乙個單列索引(b),則不是。
在建立索引中對於相同的列,我們可能會按照不同的順序來建立索引來滿足不同的業務需求。
10、範圍條件in和》、《在多列索引中使用的區別?
in在索引中會轉化為多個等式,而<、>不可以。
11、索引導致的效能缺點有哪些?
索引的問題:
(1)占用硬碟,mysql需要的時候會調入記憶體,但是如果太大仍然會有問題。
(2)導致插入、更新等操作變慢
12、選擇索引和編寫利用索引的查詢,需要記住的三個原則:
(1)單行訪問是很慢的
(2)按順序訪問範圍資料是很快的
(3)索引覆蓋查詢是很快的
mysql索引知識 mysql索引必會知識點
聚簇索引和非聚簇索引 主要區別在於組織索引的結構是否和資料儲存的結構一樣。一般再innodb中主鍵索引就是聚簇索引,沒有主鍵會預設生成隱藏主鍵字段。理論上也可以指定其他欄位為聚簇索引,聚簇索引也不必唯一。主鍵索引和普通索引 我們都知道,innodb引擎下的儲存結構為b 樹,也就是說首先根據key值一...
mysql索引技術 MySQL索引知識介紹
前言 索引是mysql資料庫中的重要物件之一,索引的目的在於提高查詢效率。可以模擬字典中的目錄,查詢字典內容時可以根據目錄查詢到資料的存放位置,然後直接獲取即可。索引是表的目錄,在查詢內容之前可以先在目錄中查詢索引位置,以此快速定位查詢資料。需要說明的是,mysql支援諸多儲存引擎,而各種儲存引擎對...
mysql索引知識備註
mysql索引分類 innodb和myisam預設的索引是btree索引 而mermory預設的索引是hash索引。myisam葉子節點儲存的是表的位址,所以說資料檔案和索引檔案是分開的,也稱為非聚集 innodb不同,主索引它的葉子節點儲存的並不是表的位址,而是資料。輔助索引葉子節點儲存的是主鍵的...