資料庫查詢和資料庫 MySQL 索引的優化建議

2021-09-26 08:56:10 字數 2851 閱讀 4557

索引是幫助mysql高效獲取資料的資料結構,在儲存引擎中實現的,所以每種儲存引擎中的索引都不一樣。那麼,資料庫中的索引有什麼作用?引入索引的目的是為了加快查詢速度。如果資料量很大,大的查詢要從硬碟載入資料到記憶體當中。

一、資料庫查詢效能的優化涉及到的技術面非常廣,一般建議用以下幾個手段實行:

1、減少資料訪問

相關的技術就是建立合適的索引,將全表掃瞄、索引掃瞄(scan)等耗時的操作轉化為索引查詢(seek)。建立正確的索引,能讓資料庫查詢效能提公升100-1000倍甚至更高,就好比一本非常厚的詞典,如果沒有任何索引,你要查乙個東西,那可是相當費盡,需要整本書查一遍,有索引就可以直接根據索引定位了。這是最重要的改善效能的途徑。

2、減少返回的資料

在網路中傳輸資料,頻寬是有限的,如果能按需提取最少量的資料,會起到不錯的作用。這裡需要注意的是,在sql中,不要出現select *,而是需要什麼字段,就提取什麼字段。

3、減少與資料庫互動次數

網路資源有限,顯然,頻繁與資料庫互動,也是制約效能的乙個因素。乙個良好的建議就是,使用儲存過程,或者批處理語句,這樣能減少與資料庫的互動,提公升一部分效能。

4、減少cpu的負荷

這裡,主要是使用快取計畫。在查詢中,盡量使用引數化的查詢。這樣的話,資料庫會對查詢引數進行快取,從而復用查詢計畫。

5、提公升硬體效能

這是最後一招了,如果其他方面都已經做得非常不錯了,效能瓶頸在cpu,記憶體和磁碟上,那採取提公升硬體效能的方案就會顯得比較合適了,否則還是先去優化其他的地方吧。

以上5個層次的優化帶來的效能改善,是依次下降的,是乙個倒置的金字塔。

二、下面說一下索引以及優化建議

索引能大幅度提高查詢和排序效能,但是,在插入、刪除、以及修改了主鍵的操作中,是需要維護索引順序的。如果一張頻繁變更的表,是不宜建立過多的索引的,索引帶來的負面效能影響,將會得不償失。

索引優化,是乙個很考究的事情,它需要找到乙個平衡點。

mysql的優化主要分為結構優化(scheme optimization)和查詢優化(query optimization)。本章討論的高效能索引策略主要屬於結構優化範疇。本章的內容完全基於上文的理論基礎,實際上一旦理解了索引背後的機制,那麼選擇高效能的策略就變成了純粹的推理,並且可以理解這些策略背後的邏輯。

索引優化建議

1、字首索引

字首索引就是用列的字首代替整個列作為索引key,當字首長度合適時,可以做到既使得字首索引的選擇性接近全列索引,同時因為索引key變短而減少了索引檔案的大小和維護開銷。

一般來說以下情況可以使用字首索引:

字串列(varchar,char,text等),需要進行全欄位匹配或者前匹配。也就是=『***』 或者 like 『***%』

字串本身可能比較長,而且前幾個字元就開始不相同。比如我們對中國人的姓名使用字首索引就沒啥意義,因為中國人名字都很短,另外對收件位址使用字首索引也不是很實用,因為一方面收件位址一般都是以xx省開頭,也就是說前幾個字元都是差不多的,而且收件位址進行檢索一般都是like 』%***%』,不會用到前匹配。相反對外國人的姓名可以使用字首索引,因為其字元較長,而且前幾個字元的選擇性比較高。同樣電子郵件也是乙個可以使用字首索引的字段。

前一半字元的索引選擇性就已經接近於全字段的索引選擇性。如果整個欄位的長度為20,索引選擇性為0.9,而我們對前10個字元建立字首索引其選擇性也只有0.5,那麼我們需要繼續加大字首字元的長度,但是這個時候字首索引的優勢已經不明顯,沒有太大的建字首索引的必要了。

2、主鍵外檢一定要建索引。

3、對 where,on,group by,order by **現的列使用索引。

4、盡量選擇區分度高的列作為索引,區分度的公式是count(distinct col)/count(*),表示欄位不重複的比例,比例越大我們掃瞄的記錄數越少,唯一鍵的區分度是1,而一些狀態、性別字段可能在大資料面前區分度就是0。

5、對較小的資料列使用索引,這樣會使索引檔案更小,同時記憶體中也可以裝載更多的索引鍵。

6、索引列不能參與計算,保持列「乾淨」,比如from_unixtime(create_time) = 』2014-05-29』就不能使用到索引,原因很簡單,b+樹中存的都是資料表中的字段值,但進行檢索時,需要把所有元素都應用函式才能比較,顯然成本太大。所以語句應該寫成create_time = unix_timestamp(』2014-05-29』)。

7、為較長的字串使用字首索引。

8、盡量的擴充套件索引,不要新建索引。比如表中已經有a的索引,現在要加(a,b)的索引,那麼只需要修改原來的索引即可。

9、不要過多建立索引, 權衡索引個數與dml之間關係,dml也就是插入、刪除資料操作。這裡需要權衡乙個問題,建立索引的目的是為了提高查詢效率的,但建立的索引過多,會影響插入、刪除資料的速度,因為我們修改的表資料,索引也需要進行調整重建。

10、對於like查詢,」%」不要放在前面。

select * fromhoudunwangwhereunamelike』後盾%』 – 走索引。

select * fromhoudunwangwhereunamelike 「%後盾%」 – 不走索引。

11、查詢where條件資料型別不匹配也無法使用索引。

字串與數字比較不使用索引;

create tablea(achar(10))。

explain select * fromawherea=「1」 – 走索引。

explain select * from a where a=1 – 不走索引。

正規表示式不使用索引,這應該很好理解,所以為什麼在sql中很難看到regexp關鍵字的原因。

MySQL查詢資料庫表和資料庫字段

information schema資訊資料庫 mysql中存在乙個自帶的資料庫information schema,其中儲存著關於mysql伺服器所維護的所有其他資料庫的資訊。查詢test database中的檢視 select from information schema.tables whe...

mysql資料庫索引名 Mysql資料庫索引簡介

1.什麼是索引?資料庫索引是表中的乙個特殊的資料結構,存放的記錄的快速檢索的值,也稱為目錄,被儲存在乙個地方,所以索引是乙個存在的檔案,並不是儲存在記憶體中 索引的存在是為了在查詢時,可以直接通過查詢索引找到那一條記錄所在的位置,而不是逐一的去檢索,大大的提高的查詢的效率 那麼是不是每一列都建立乙個...

資料庫和資料庫物件

系統資料庫是指安裝完mysql伺服器後,會附帶的一些資料庫,系統資料庫會記錄一些必需的資訊,使用者不能直接修改這些系統資料庫。各個系統資料庫的作用如下 information schema 主要儲存系統中的一些資料庫物件資訊,如使用者表資訊 列資訊 許可權資訊 字符集資訊和分割槽資訊等。perfor...