1. 程式人生 > >MySQL優化——關於索引

MySQL優化——關於索引

MySQL中btree索引和hash索引的區別

MySQL中主要有兩種索引,BTree索引和hash索引。預設情況下innodb和myisam都是使用的Btree索引,memory表使用的是hash索引。hash索引的查詢複雜度為o(1)。也就是說hash索引查詢速度比Btree快。但是hash索引由於是隨機雜湊函式,資料會被放在不連續的地方,所以無法利用hash索引快速的查詢某個區間的值。hash索引無法對排序進行優化,在涉及排序的查詢時,btree索引的速度遠遠大於hash索引。hash索引如果對”nihao”建立了索引,那麼在查詢”ni”時,就無法利用到索引。而btree卻可以,因為在底層,btree是一棵平衡二叉樹,查詢時可以利用到左字首。

MySQL中Btree索引的使用

1.where字句中的多個索引只能使用一個


比如select * from table_test where name=”zzz” and age=”17”,在這個句子中,要麼name的索引發揮作用,要麼age的索引發揮作用,而不會兩者都發揮作用。

2.多列複合索引的使用規則

多列複合索引的使用要滿足左字首規則。比如我們有一個複合索引index(x,y,z)。我們再查詢時使用了以下幾種方式查詢:
1.select * from table_test where x=1 and y=2 and z=3
2.select * from table_test where x=1 and y>2 and z=3
3.select * from table_test where x=1 and y=2 and z>3
4.select * from table_test where x=1 and y like “%abc” and z=3
第一條可以使用到x列索引,y列索引,z列索引。
第二條可以使用到x列索引,y列索引,無法使用z列索引。
第三條可以使用到x列索引,y列索引,z列索引。
第四條可以使用到x列索引,y列索引,無法使用到z列索引。
所謂左字首使用規則,是指在使用一個複合多列索引的時候,從左往右看過去,沒有發生過截斷。發生截斷是指該複合索引在使用索引是,無法精確的定位到一條記錄,而是定位到一部分記錄。

3.聚簇索引和非聚簇索引

myisam中,所有的索引都不真正儲存資料,而是用一個指標指向資料真正的物理存放地址。每次使用索引查詢資料時,先使用索引查詢,然後再根據索引指標到物理儲存中取出資料。
innodb中,主索引(primary key)檔案上,直接存放了真正的資料資訊。其他的索引,通過指標指向主索引的位置。
像innodb這樣,索引和資料存放再一起的索引,我們稱之為聚簇索引。在innodb中,如果沒有主鍵,會unique索引會成為主鍵,如果沒有unique索引,那麼系統會自己生成rowid當作主鍵。
聚簇索引的優點在於查詢資料時,索引和資料在一起,省去了通過指標到磁碟上尋找資料的過程(即不用回行)。缺點在於,因為資料和索引存放在一起,如果存入的主鍵不規則,會導致底層的二叉樹頻繁的調整樹結構(頁分裂),導致插入資料速度降低。因此聚簇索引的主鍵值,應儘量是連續增長的值,而不是要是隨機值, 不要用隨機字串或UUID,否則會造成大量的頁分裂與頁移動。

4.索引覆蓋

索引覆蓋是指如果查詢的列剛好建立了索引,那麼查詢只需要再索引檔案上進行,而不用再回行取資料。這樣可以大大提高查詢速度。這稱之為索引覆蓋。理想的索引一般建立在查詢頻率非常高的欄位上面,儘量能覆蓋常用的查詢欄位。

5.索引長度

索引長度直接影響索引檔案的大小,影響增刪改的速度,並間接影響查詢速度。建立的索引越長,重複度越低,區分度越高,索引效果越好,但是增刪改變慢,影響查詢速度。
建立的索引越短,重複度越高,區分度越低,查詢效果越不好。
為了在區分度和長度之間取得一個平衡,我們可以使用sql語句來測試區分度和索引長度之間的關係。假如我們要在word上建立索引,可以通過下面的sql語句來測試區分度。

select count(distinct left(word,n))/count(*) from dict

將n從1依次增大,然後檢視區分度,最後在長度和區分度之間做出權衡。

6.偽hash索引

有時候資料庫中存放的資料字首相似,比如網址。http://www.baidu.com,http://www.sina.com中,
前11個字元都是相同的,在這種情況下,為了達到較高的區分度,需要建立的索引長度過長,一個好的解決辦法是在儲存網址的時候,倒序儲存。另一個辦法就是使用偽hash。使用偽hash時,我們需要在資料表中多存放一個欄位(空間換時間)。還拿這個例子來說,我們可以定義一個hash函式,這個hash函式可以將網址對映成一串數字。儲存的時候,先用hash函式來計算出網址的雜湊值,再用雜湊值來查詢。在資料表中,建立索引的時候,不在網址欄位上建立,而在雜湊欄位上建立。由於雜湊欄位是整數型別,因此索引只需要4個位元組的長度。

7.查詢時延遲關聯

舉個例子,我們使用以下的sql語句來查詢:

select * from table_test where title like "%today%"

這條sql語句在查詢時無法利用索引,即時在today欄位上我們建立了索引 。我們改寫這個sql語句如下:

select a.* from table_test as a inner join (select id from table_test where title like "%today%") as b on a.id=b.id

這兩個sql語句具有相同的效果。唯一不同之處在於,第二個語句先把符合條件的id統一查找出來,然後再通過id去查詢。第一個語句是掃描全表對比是否符合where子句的條件,如果符合就用id去回行取資料,邊查詢邊取資料。第二種方法實際上是將回行取資料的過程給延後了。但是卻可以提高效率。這稱之為延遲查詢。

8.索引與排序

如果經常需要對某個欄位進行排序,就可以將這個字建立索引。因為這這樣可以避免file sort,索引本身是有序的。

相關推薦

MySQL優化——索引

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

6.MySQL優化索引合併優化

介紹 索引合併訪問方法檢索具有多個範圍掃描的行併合並其結果合而為一。 此訪問方法僅合併來自單個表的索引掃描,而不是跨多個掃描表。 合併可以生成其基礎掃描的聯合,交叉或交叉聯合。 下面舉個例子介紹一下如何使用: SELECT * FROM tbl_name WHERE key1 =

MySQL優化索引優化漢字模糊查詢語句

利用MySQL這種關係型資料庫來做索引,的確有些勉強了,也只能看情況來說了,有些簡單的功能還是可以考慮的。 對於模糊查詢語句,最不利的情況是要like '%key%'這樣的查詢,但是如果是like 'key%'這種情況,那麼mysql的索引在些查詢方式上還是可以優化的。 網

MySQL優化----索引

一、主鍵索引 建立主鍵索引 索引名規範:ix_表名_欄位名 語法: create index 索引名 on 表名(欄位名) 檢視索引是否建立成功 show index from 表名\G; 二、

MySQL優化--索引

一、什麼是索引?   索引用來快速地尋找那些具有特定值的記錄,所有MySQL索引都以B-樹的形式儲存。如果沒有索引,執行查詢 時MySQL必須從第一個記錄開始掃描整個表的所有記錄,直至找到符合要求的記錄。表裡面的記錄數量越多,這個操作的代價就越高。如果作為搜尋條件的列上 已經

mysql優化-索引

一、什麼是索引?   索引用來快速地尋找那些具有特定值的記錄,所有MySQL索引都以B-樹的形式儲存。如果沒有索引,執行查詢時MySQL必須從第一個記錄開始掃描整個表的所有記錄,直至找到符合要求的記錄。表裡面的記錄數量越多,這個操作的代價就越高。如果作為搜尋條件的列上已經建

MySql優化-索引命中

在專案開發中SQL是必不可少的,表索也一樣.這些SQL的執行效能不知道嗎?有多少是命中了索引的?命中哪個索引?索引中有哪個是無效索引?這些無效索引是否會影響系統的效能?帶著這些問題我們一起來學習一下.   MySql中是通過 Explain 命令來分析低效SQL

mysql優化 索引基本用法

說起提高資料庫效能,索引是最物美價廉的東西了。不用加記憶體,不用改程式,不用調sql,只要執行個正確的’create index’,查詢速度就可能提高百倍千倍,這可真有誘惑力。可是天下沒有免費的午餐,查詢速度的提高是以插入、更新、刪除的速度為代價的,這些寫

mysql優化 索引優化策略

索引優化策略 1:索引型別 1.1 B-tree索引 注: 名叫btree索引,大的方面看,都用的平衡樹,但具體的實現上, 各引擎稍有不同,比如,嚴格的說,NDB引擎,使用的是T-tree,而Myisam,innodb中,預設用B-

MySQL優化索引

1.  MySQL如何使用索引 索引用於快速查詢具有特定列值的行。如果沒有索引,MySQL必須從第一行開始,然後遍歷整個表以找到相關的行。表越大,花費越多。如果表中有相關列的索引,MySQL可以快速確定要在資料檔案中間查詢的位置,而不必檢視所有資料。這比順序讀取每一行要快得多。 大多數MySQL索引

MySQL索引及其優化

告訴 出現 緩存 tab 關鍵字 忽略 primary lba lec 前言 索引對查詢的速度有著至關重要的影響,理解索引也是進行數據庫性能調優的起點。考慮如下情況,假設數據庫中一個表有10^6條記錄,DBMS的頁面大小為4K,並存儲100條記錄。如果沒有索引,查詢將對整個

mysql-優化班學習-8-20170606-MySQL索引

ng- 文件 mar 索引 b+樹 xtend pen 自增列 .net MySQL索引 索引、事務、鎖、InnoDB引擎 tablespace\segment\extended\page\row gao

MySQL性能優化的21個最佳實踐 和 mysql使用索引

oct 靜態 state zid 希望 lte 適合 實踐 打開 今天,數據庫的操作越來越成為整個應用的性能瓶頸了,這點對於Web應用尤其明顯。關於數據庫的性能,這並不只是DBA才需要擔心的事,而這更是我 們程序員需要去關註的事情。當我們去設計數據庫表結構,對操作數據庫時(

mysql優化索引

總結 例如 drop mysql5 建立 語句 運算操作 空間 耗時 Mysql優化之使用索引 1,索引簡介 索引是單獨一種數據結構,單獨存在的一個空間。可以把數據表裏的建立了索引的字段,進和物理地址,存在在一塊,這塊空間就是‘索引’。 查詢數據先從索引中查詢,查詢到之後,

mysql 優化策略(如何利用好索引

i/o 建立索引 lar .net https 壓縮 oracle 包括 analyze 命名規則:表名_字段名1、需要加索引的字段,要在where條件中2、數據量少的字段不需要加索引3、如果where條件中是OR關系,加索引不起作用4、符合最左原則https://segm

mysql優化索引

索引 mysql優化 表的優化1.定長與變長分離 如 int,char(4),time核心且常用字段,建成定長,放在一張表; 而varchar,text,blob這種變長字段適合單放一張表,用主鍵與核心表關聯。2.常用字段和不常用字段要分離3.在 1 對多需要關聯統計的字段上,添加冗余字段

mysql優化專題」90%程序員面試都用得上的索引優化手冊(5)

根據 eat index 重要 進行 需要 範圍查詢 記錄 文件的 目錄(技術文) 多關於索引,分為以下幾點來講解: 一、索引的概述(什麽是索引,索引的優缺點) 二、索引的基本使用(創建索引) 三、索引的基本原理(面試重點) 四、索引的數據結構(B樹,hash) 五、創建索

mysql優化專題」單表查詢優化的一些小總結,非索引設計(3)

flush src innodb atp show 優化 ase 驗證 where子句 單表查詢優化:(關於索引,後面再開單章講解) (0)可以先使用 EXPLAIN 關鍵字可以讓你知道MySQL是如何處理你的SQL語句的。這可以幫我們分析是查詢語句或是表結構的性能瓶頸。

3.MySQL優化---單表查詢優化的一些小總結(非索引設計)

sql優化 所有 結果集 單表 搜索 結果 查詢語句 cnblogs sel 整理自互聯網.摘要: 接下來這篇是查詢優化。其實,大家都知道,查詢部分是遠遠大於增刪改的,所以查詢優化會花更多篇幅去講解。本篇會先講單表查詢優化(非索引設計)。然後講多表查詢優化。索引優化設計以及

MySQL索引原理與慢查詢優化

英文 borde 發生 聚集 引擎 返回 位置 時間 pro 一 索引介紹 二 索引類型 三 索引分類 四 聚合索引和輔助索引 五 測試索引 六 正確使用索引 七 組合索引 八 註意事項 九 查詢計劃 十 慢日誌查詢 十一 大數據量分頁優化 1. 索引介紹