1. 程式人生 > >資料庫優化-索引

資料庫優化-索引

1.什麼是索引

索引通俗點來說就好比我們的字典目錄,我們可以通過目錄快速的定位到我們要查詢的字,相對應的我們也需要花費磁碟空間去建立索引。

2.如何建立和刪除索引(不同的資料庫語法會有差異)

索引是建立在資料庫表上的,他是針對欄位來的,所以建立索引的時候我們要指定哪個欄位,我們也可以指定多個欄位。索引名要唯一。

建立:

CREATE INDEX 索引名 on 表名(欄位1,欄位2,...);

刪除:

DROP INDEX 索引名 on 表名;

3.關於索引的幾個問題

3.1下面是引用別人的文章:

①索引有什麼代價?哪些場景下你需要建索引?或者有時候反過來問,哪些場景下不推薦建索引。

②建好索引之後,怎麼才能最高效地利用索引?或者反過來問,請說出一個無法有效利用已建索引的案例。

 從結構上來看,索引好比是一棵B樹(也叫B*或者B+),假設學生表裡只有學生ID和姓名兩列,該學生表裡有1000個學生,學號分別從1到1000,如果針對ID建立索引,大致的結構如下圖所示。 

  當然,在實際的資料庫系統中,索引要比這個複雜得多,但從這個圖裡,我們能大致看出索引的工作原理。 
索引建好後,如果我們要查詢ID為111的學生,則資料庫系統就會走索引,從圖2.1中我們可以看到,根據根節點的指引,會找到第二層從左往右第二個資料塊,以此類推,會在第四層裡得到ID為111的實體地址,然後直接從硬盤裡找資料。

  反過來,如果沒有建索引,資料庫系統可能就要從一個大的範圍裡逐一定位查詢,效率就沒這麼高了。

  索引的好處大家已經看到了,那麼為了得到這個“查詢效率高”的好處,我們要付出了什麼樣的代價呢?

  1索引需要佔硬碟空間,這是空間方面的代價。

  2一旦插入新的資料,就需要重新建索引,這是時間上的代價。

  關於索引效能問題,我會細問,你建索引的表規模多少?不少人直接告訴我表就幾千條,我或者問,索引有什麼代價?不少回答是索引是隻有好處沒壞處的,也就是說,可以隨便建。

  對此我們來詳細分析下(也就是大家在面試時需要說的):

  場景一,資料表規模不大,就幾千行,即使不建索引,查詢語句的返回時間也不長,這時建索引的意義就不大。當然,若就幾千行,索引所佔的空間也不多,所以這種情況下,頂多屬於“價效比”不高。

  場景二,某個商品表裡有幾百萬條商品資訊,同時每天會在一個時間點,往其中更新大概十萬條左右的商品資訊,現在用where語句查詢特定商品時(比如wherename=‘XXX’)速度很慢。為了提升查詢效率可以建索引,但當每天更新資料時,又會重建索引,這是要耗費時間的。這時就需要綜合考慮,甚至可以在更新前刪除索引,更新後再重建。

  場景三,從上圖中可以看到,因為在資料表裡ID值都不相同,所以索引能發揮出比較大的作用。相反,如果某個欄位重複率很高,如性別欄位,或者某個欄位大多數值是空(null),那麼不建議對該欄位建索引。

  請大家記住,一定是有業務需求了才會建索引。比如在一個商品表裡,我們經常要根據name做查詢,如果沒有索引,查詢速度會很慢,這時就需要建索引。但在專案開發中,如果不經常根據商品編號查詢,那麼就沒必要對編號建索引。

  最後再強調一次,建索引是要付出代價的,沒事別亂建著玩,同時在一個表上也不能建太多的索引。

  下面說下索引建好了該怎麼用?畢竟大家花了不少時間和空間代價建了索引,至少得回本吧?

  如果出現一些不好的SQL語句,那麼索引就白建了。下面通過一些具體的例子來看索引的正確用法。

  ①語句一:select name from 商品表。不會用到索引,因為沒有where語句。

  ②語句二:select * from 商品表 wherename=‘Java書’,會用到索引,如果專案裡經常用到name來查詢,且商品表的資料量很大,而name值的重複率又不高,那麼建議建索引。

  ③語句三:select*from商品表wherenamelike‘Java%’這是個模糊查詢,會用到索引,請大家記住,用like進行模糊查詢時,如果第一個就是模糊的匹配符,比如wherenamelike‘%java’,那麼在查詢時不會走索引。在其他情況下,不論用了多少個%,也不論%的位置,只要不出現在第一個位置,那麼都能用到索引。

  學生成績表裡有兩個欄位:姓名和成績。現在對成績這個整數型別的欄位建索引。

  ①第一種情況,當數字型欄位遇到非等值操作符時,無法用到索引。比如: 
selectnamefrom學生成績表where成績>95,一旦出現大於符號,就不能用到索引,為了用到索引,我們應該改一下SQL語句裡的where從句:where成績in(96,97,98,99,100)

  ②第二種情況,如果對索引欄位進行了某種左值操作,那麼無法用到索引。

  能用到索引的寫法:selectnamefrom學生成績表where成績=60

  不能用到索引的寫法:selectnamefrom學生成績表where成績+40=100

  ③第三種情況,如果對索引欄位進行了函式操作,那麼無法用到索引。

  比如SQL語句:select*from商品表wheresubstr(name)=‘J’,我們希望查詢商品名首字母是J的記錄,可一旦針對name使用函式,即使name欄位上有索引,也無法用到。

  關於索引,當然還有點陣圖索引和複合索引等,如果大家要應聘更高階的崗位(比如有5年經驗了),那麼就不能止步於此了,但根據我的面試經驗,上述關於索引的說辭對工作經驗3年以下的候選人是有幫助的。

  其實我知道,不少程式設計師平時用過索引,但不知道怎麼說,這很吃虧。對於高階程式設計師而言,如果你這都說不好,那麼你的能力比初級的要高多少?對於初級程式設計師而言,如果你掌握了,而且能在面試中很好地說,那麼你和同等能力的人相比,就很佔優勢。


相關推薦

資料庫優化 ------ 索引的使用問題

  最近,在工作的過程中,會時不時的碰到要不要新增索引的問題,於是結合自己的經歷,忙裡偷閒總結下,希望自已以後忘記了可以快速的記憶起來,同時也希望也可以幫助一些跟我一樣有需求的小夥伴。   一直以來,我總是不自覺的去想,到底什麼是索引?為什麼建立索引可以加快查詢的速度?直

資料庫優化-索引

1.什麼是索引索引通俗點來說就好比我們的字典目錄,我們可以通過目錄快速的定位到我們要查詢的字,相對應的我們也需要花費磁碟空間去建立索引。2.如何建立和刪除索引(不同的資料庫語法會有差異)索引是建立在資料庫表上的,他是針對欄位來的,所以建立索引的時候我們要指定哪個欄位,我們也可

資料庫優化---索引

4.1聚簇索引聚簇索引的資料的物理存放順序與索引順序是一致的(查詢快,修改慢),即:只要索引是相鄰的,那麼對應的資料一定也是相鄰地存放在磁碟上的。如果主鍵不是自增id,那麼可以想象,它會幹些什麼,不斷地調整資料的實體地址、分頁,當然也有其他一些措施來減少這些操作,但卻無法徹底避免。但,如果是自增的,那就簡單了

阿里P8架構師談:MySQL資料庫索引原理、與慢SQL優化的5大原則

MySQL憑藉著出色的效能、低廉的成本、豐富的資源,已經成為絕大多數網際網路公司的首選關係型資料庫。雖然效能出色,但所謂“好馬配好鞍”,如何能夠更好的使用它,已經成為開發工程師的必修課,我們經常會從職位描述上看到諸如“精通MySQL”、“SQL語句優化”、“瞭解資料庫原理”等要求。 我們知道一般

10.18 資料庫索引優化方案

索引 作用:約束+加速查詢 普通索引 create index ix_name on 表名(欄位) 作用:加速查詢

oracle資料庫建立索引以及簡單優化sql語句

Oracle 建立索引及SQL優化 資料庫索引: 索引有單列索引 複合索引之說 如何某表的某個欄位有主鍵約束和唯一性約束,則Oracle 則會自動在相應的約束列上建議唯一索引。資料庫索引主要進行提高訪問速度。 建設原則:  1、索引應該經常建在Where 子句經常用到的列上。如

【學習筆記】資料庫優化索引(聚簇索引&非聚簇索引

索引:對資料庫表中一列或多列的值進行排序的一種結構,通過索引可快速訪問資料庫表中的特定資訊,即通過索引對資料列的值進行結構化排序。 其中,索引包含聚簇索引和非聚簇索引 聚簇索引的順序就是資料的物理儲存順序 非聚簇索引的索引順序與資料物理排列順序無關 所以一個表

資料庫索引優化策略

                                             索引優化策略 關於什麼是索引,如何建立索引,索引的優缺點等,請移步我的另外一篇文章mysql索引簡談 一、為什麼要建立索引? 一句話,為了加快查詢效率。注意這裡的“查詢”,而不是增

最全MySQL面試60題(含答案):儲存引擎+資料庫鎖+索引+SQL優化

Mysql中有哪幾種鎖? MyISAM支援表鎖,InnoDB支援表鎖和行鎖,預設為行鎖 表級鎖:開銷小,加鎖快,不會出現死鎖。鎖定粒度大,發生鎖衝突的概率最高,併發量最低 行級鎖:開銷大,加鎖慢,會出現死鎖。鎖力度小,發生鎖衝突的概率小,併發度最高 Mysql中有哪些

SQL Server資料庫優化:如何設計索引才能提高資料查詢效能?

當你發現隨著系統升級,版本迭代,使用者不斷增加,你的系統逐漸變慢的時候,就要考慮一下是不是需要對資料庫進行優化了(當然,效能瓶頸不一定在資料庫上),通常來說,優化資料庫的手段,我們最先想到的就是索引。 索引的目的是為了讓查詢更快。 為了保證你建立的索

sql優化資料庫新增索引

索引作用在索引列上,除了上面提到的有序查詢之外,資料庫利用各種各樣的快速定位技術,能夠大大提高查詢效率。特別是當資料量非常大,查詢涉及多個表時,使用索引往往能使查詢速度加快成千上萬倍。例如,有3個未索引的表t1、t2、t3,分別只包含列c1、c2、c3,每個表分別含有1000行資料組成,指為1~1000的數值

Mysql資料庫優化系列(五)------索引優化策略之面試題

實驗: Type:range   此處使用上了範圍索引 Key_len:12/3=4列 使用到了索引c1,c2,c3,c4.解析:因為order by c3是有序的,所以c3,c4也用到了索引 上圖用到了c1,c2,c3,order by有序,可以利用索引。 上圖

資料庫中的聚集索引、非聚集索引優化索引

原文: 資料庫中的聚集索引、非聚集索引、優化索引 這篇文章我們來討論一下索引的問題吧,這篇文章不會介紹怎麼建立索引,但是會介紹怎麼優化索引。   什麼是索引? 索引是對記錄按照多個欄位進行排序的一種方式。對錶中的某個欄位建立索引會建立另一種資料結構,其中儲存著欄位的值,每個值又指向與它相關的

資料庫優化索引

索引的優缺點:          優點:提高程式效率.          缺點:增加,刪除慢,索引檔案需要更新,增加記憶體 新增索引欄位          要儘量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。 索引優化 1.避免

sql server 資料庫優化--顯示執行計劃 你真的知道索引使用???

首先在PRID欄位上建立非聚集索引。 CREATE UNIQUE NONCLUSTERED INDEX UNC_PRID ON PerformanceIssue (PRID) GO 執行下面語句並檢視執行計劃的結果。 Select PRID, PRCode, PRDesc From Perform

資料庫效能優化-索引與sql相關優化

一:前言      什麼是索引?      索引是幫助MySQL高效獲取資料的資料結構。索引是在儲存引擎中實現的,所以每種儲存引擎中的索引都不一樣。如MYISAM和InnoDB儲存引擎只支援BTre

oracle 優化--索引

數據庫應用 oracle create 程序 原則性 一、事務1、簡介事務是數據處理的核心,是業務上的一個邏輯單元,它能夠保證其中對數據所有的操作,要麽全部成功,要麽全部失敗。DBMS通過事務的管理來協調用戶的並發行為,減少用戶訪問資源的沖突。 1)顯示提交:當事務遇到COMMIT指令時,

MySQL優化——索引

即使 sel 屬於 能力 來看 yun 特定 比較 ont 內容來自:https://yq.aliyun.com/articles/214494?utm_content=m_31338 對此我們來詳細分析下(也就是大家在面試時需要說的):   場景一,數據表規模不大,就

SQL SERVER全面優化-------索引有多重要?

link 發現 main hash join 不能 舉例 最優 double 無法 想了好久索引的重要性應該怎麽寫?講原理結構?我估計大部分人不願意看,也不願意花那麽多時間仔細研究。光寫應用?感覺不明白原理一樣不會用。舉例說明?情況太多也寫不全....到底該怎麽寫呢?   

mysql性能優化-慢查詢分析、優化索引和配置【轉】

簡單的 ssi any 通過命令 字型 reat created 效果 tle 一、優化概述 二、查詢與索引優化分析 1性能瓶頸定位 Show命令 慢查詢日誌 explain分析查詢 profiling分析查詢 2索引及查詢優化 三、配置優化 1) max_c