1. 程式人生 > >MySQL 索引及優化實戰(轉載自蒲葦 CSDN技術頭條)

MySQL 索引及優化實戰(轉載自蒲葦 CSDN技術頭條)

索引概念和作用

索引是一種使記錄有序化的技術,它可以指定按某列/某幾列預先排序,從而大大提高查詢速度(類似於漢語詞典中按照拼音或者筆畫查詢)。

索引的主要作用是加快資料查詢速度,提高資料庫的效能。

MySQL 索引型別

從物理儲存角度上,索引可以分為聚集索引和非聚集索引。

1. 聚集索引(Clustered Index)

聚集索引決定資料在磁碟上的物理排序,一個表只能有一個聚集索引。

2. 非聚集索引(Non-clustered Index)

非聚集索引並不決定資料在磁碟上的物理排序,索引上只包含被建立索引的資料,以及一個行定位符 row-locator,這個行定位符,可以理解為一個聚集索引物理排序的指標,通過這個指標,可以找到行資料。

從邏輯角度,索引可以分為以下幾種。

  1. 普通索引:最基本的索引,它沒有任何限制。

  2. 唯一索引:與普通索引類似,不同的就是索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。

  3. 主鍵索引:它是一種特殊的唯一索引,用於唯一標識資料表中的某一條記錄,不允許有空值,一般用     primary key 來約束。主鍵和聚集索引的關係詳見“問題詳解”中的第4題。

  4. 聯合索引(又叫複合索引):多個欄位上建立的索引,能夠加速複合查詢條件的檢索。

  5. 全文索引:老版本     MySQL 自帶的全文索引只能用於資料庫引擎為 MyISAM 的資料表,新版本 MySQL 5.6 的 InnoDB 支援全文索引。預設 MySQL 不支援中文全文檢索,可以通過擴充套件 MySQL,新增中文全文檢索或為中文內容表提供一個對應的英文索引表的方式來支援中文。

MySQL索引優化規則

可以通過以下規則對 MySQL 索引進行優化。

1.前導模糊查詢不能使用索引。

例如下面 SQL 語句不能使用索引。

select*fromdocwheretitlelike'%XX'

而非前導模糊查詢則可以使用索引,如下面的 SQL 語句。

select*fromdocwheretitlelike'XX%'

頁面搜尋嚴禁左模糊或者全模糊,如果需要可以用搜索引擎來解決。

2.union、in、or 都能夠命中索引,建議使用 in。

  • union:能夠命中索引。

示例程式碼如下:

select*fromdocwherestatus=1

unionall

select*fromdocwherestatus

=2

直接告訴 MySQL 怎麼做,MySQL 耗費的 CPU 最少,但是一般不這麼寫 SQL。

  • in:能夠命中索引。

示例程式碼如下:

select*fromdocwherestatusin(1,2)

查詢優化耗費的 CPU 比 union all 多,但可以忽略不計,一般情況下建議使用 in

  • or:新版的 MySQL 能夠命中索引。

示例程式碼如下:

select*fromdocwherestatus=1orstatus=2

查詢優化耗費的 CPU 比 in 多,不建議頻繁用 or。

3.負向條件查詢不能使用索引,可以優化為 in 查詢。

負向條件有:!=、<>、not in、not exists、not like 等。

例如下面程式碼:

select*fromdocwherestatus!=1andstatus!=2

可以優化為 in 查詢:

select*fromdocwherestatusin(0,3,4)

4.聯合索引最左字首原則(又叫最左側查詢)

  • 如果在(a,b,c)三個欄位上建立聯合索引,那麼它能夠加快 a | (a,b) | (a,b,c) 三組查詢速度。

例如登入業務需求,程式碼如下。

selectuid, login_timefromuserwherelogin_name=?andpasswd=?

可以建立(login_name, passwd)的聯合索引。

因為業務上幾乎沒有 passwd 的單條件查詢需求,而有很多 login_name 的單條件查詢需求,所以可以建立(login_name, passwd)的聯合索引,而不是(passwd, login_name)。

  • 建聯合索引的時候,區分度最高的欄位在最左邊。

  • 如果建立了(a,b)聯合索引,就不必再單獨建立 a 索引。同理,如果建立了(a,b,c)聯合索引,就不必再單獨建立 a、(a,b) 索引。

  • 存在非等號和等號混合判斷條件時,在建索引時,請把等號條件的列前置。如     where a>? and b=?,那麼即使 a 的區分度更高,也必須把 b 放在索引的最前列。

  • 最左側查詢需求,並不是指 SQL 語句的 where 順序要和聯合索引一致。

下面的 SQL 語句也可以命中 (login_name, passwd) 這個聯合索引。

selectuid, login_timefromuserwherepasswd=?andlogin_name=?

但還是建議 where 後的順序和聯合索引一致,養成好習慣。

5.範圍列可以用到索引(聯合索引必須是最左字首)。

  • 範圍條件有:<、<=、>、>=、between等。

  • 範圍列可以用到索引(聯合索引必須是最左字首),但是範圍列後面的列無法用到索引,索引最多用於一個範圍列,如果查詢條件中有兩個範圍列則無法全用到索引。

假如有聯合索引 (empno、title、fromdate),那麼下面的 SQL 中 emp_no 可以用到索引,而 title 和 from_date 則使用不到索引。

select*fromemployees.titleswhereemp_no <10010' and title='Senior Engineer'and from_date between '1986-01-01' and '1986-12-31'

6.把計算放到業務層而不是資料庫層。

  • 在欄位上進行計算不能命中索引。

例如下面的 SQL 語句。

select*fromdocwhereYEAR(create_time) <='2016'

即使 date 上建立了索引,也會全表掃描,可優化為值計算,如下

select*fromdocwherecreate_time <='2016-01-01'

  • 把計算放到業務層。

這樣做不僅可以節省資料庫的 CPU,還可以起到查詢快取優化效果。

比如下面的 SQL 語句:

select*fromorderwheredate< =CURDATE()

可以優化為:

select*fromorderwheredate< ='2018-01-2412:00:00'

優化後的 SQL 釋放了資料庫的 CPU 多次呼叫,傳入的 SQL 相同,才可以利用查詢快取。

7.強制型別轉換會全表掃描

如果 phone 欄位是 varchar 型別,則下面的 SQL 不能命中索引。

 select*fromuserwherephone=13800001234

可以優化為:

select*fromuserwherephone='13800001234'

8.更新十分頻繁、資料區分度不高的欄位上不宜建立索引。

  • 更新會變更 B+ 樹,更新頻繁的欄位建立索引會大大降低資料庫效能。

  • “性別”這種區分度不大的屬性,建立索引是沒有什麼意義的,不能有效過濾資料,效能與全表掃描類似。

  • 一般區分度在80%以上的時候就可以建立索引,區分度可以使用 count(distinct(列名))/count(*) 來計算。

9.利用覆蓋索引來進行查詢操作,避免回表。

被查詢的列,資料能從索引中取得,而不用通過行定位符 row-locator 再到 row 上獲取,即“被查詢列要被所建的索引覆蓋”,這能夠加速查詢速度。

例如登入業務需求,程式碼如下。

selectuid, login_timefromuserwherelogin_name=?andpasswd=?

相關推薦

MySQL 索引優化實戰(轉載蒲葦 CSDN技術頭條)

索引概念和作用索引是一種使記錄有序化的技術,它可以指定按某列/某幾列預先排序,從而大大提高查詢速度(類似於漢語詞典中按照拼音或者筆畫查詢)。索引的主要作用是加快資料查詢速度,提高資料庫的效能。MySQL 索引型別從物理儲存角度上,索引可以分為聚集索引和非聚集索引。1. 聚集索

理解MySQL--索引優化轉載

      注:很好的兩篇文章,原文地址:           第一篇.http://feiyan.info/16.html   &

Mysql索引優化

Mysql索引大多是B+樹實現,B+樹是由B樹變化而來,為了描述B-Tree,首先定義一條資料記錄為一個二元組[key, data],key為記錄的鍵值,對於不同資料記錄,key是互不相同的;data為資料記錄除key外的資料。 B樹的每個節點包括key和da

MySQL索引優化(1)儲存引擎和底層資料結構

在昨天的面試中問到了MySQL索引怎麼優化(查詢很慢怎麼辦),回答的很不理想,所以今天來總結幾篇關於MySQL索引的知識。 1.什麼是索引? 首先我們一定要明確什麼是索引?我自己的總結就是索引是一種資料結構,可以幫助我們快速訪問資料庫的指定資訊,就像一本書的目錄一樣,可以加快查詢速度 2.MySQl儲存引擎

MySQL索引查詢優化總結

存儲 一行 -1 type 一定的 關鍵技術 表示 智能 string類型 一個簡單的對比測試 前面的案例中,c2c_zwdb.t_file_count表只有一個自增id,FFileName字段未加索引的sql執行情況如下: 在上圖中,type=all,key=nul

MySQL資料庫】效能優化索引優化(一)

一、Mysql效能優化之影響效能的因素 1.商業需求的影響 不合理的需求造成的資源投入產出,這裡就用一個看上去很簡單的功能分析。需求:一個論壇帖子的總量統計,附加要求:實時更新。從功能上看來是非常容易實現的,執行一條select count(*)from表名就可以得到結果,但是如果我們採

MySQL資料庫索引優化

索引 什麼是索引 索引是用來提高資料庫效能的常用工具,索引就像資料的目錄一樣,通過索引可以快速找到需要的內容。 索引的原理,加快查詢 索引是建立了針對資料內容的排序結果的指標,根據指標快速定位所要的資料。 索引的設計原則 1  索引列一般為where子句中的列或連線列子句中的列。 2&

MySQL 索引慢查詢優化

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

MySQL 索引查詢優化總結

本文由雲+社群發表 文章《MySQL查詢分析》講述了使用MySQL慢查詢和explain命令來定位mysql效能瓶頸的方法,定位出效能瓶頸的sql語句後,則需要對低效的sql語句進行優化。本文主要討論MySQL索引原理及常用的sql查詢優化。 一個簡單的對比測試 前面的案例中,c2c_zwdb

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

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

MySQL的MyISAM和InnoDB對比優化(轉猿課論壇阿銘老師)

MyISAM和InnoDB是在使用MySQL最常用的兩個表型別,各有優缺點,視具體應用而定。基本的差別為:MyISAM型別不支援事務處理等高階處理,而InnoDB型別支援。MyISAM型別的表強調的是效能,其執行速度比InnoDB型別更快,但是不提供事務支援,而InnoDB提供事務支援已經外部鍵等高階資料庫功

MySQL函式索引優化

很多開發人員在使用MySQL時經常會在部分列上進行函式計算等,導致無法走索引,在資料量大的時候,查詢效率低下。針對此種情況本文從MySQL5.7 及MySQL8.0中分別進行不同方式的優化。 1、 MySQL5.7 MySQL5.7版本中不支援函式索引,因此 遇到函式索引的時候需要進行修改,否則即使查詢的欄位

mysql-索引優化

是否 這就是 位置 ica 函數 行為 不支持 size 空值 寫在前面:索引對查詢的速度有著至關重要的影響,理解索引也是進行數據庫性能調優的起點。考慮如下情況,假設數據庫中一個表有10^6條記錄,DBMS的頁面大小為4K,並存儲100條記錄。如果沒有索引,查詢將對整個表進

MySQL 規範優化

sys nod 直接 gpo 決定 行數 其中 blog 文件 一、建庫建表優化 1、核心規範(推薦) 表字符集選擇UTF8 (“表情”字段單獨設置為其他字符集) 存儲引擎使用INNODB 不在庫中存儲圖片、文件等 使用可變長字符串(v

mysql索引多表查詢

技術分享 類型 主表 nbsp prim group 索引 div AR 註意where,group by ,having,order by, limit 等的順序。 主表是被綁定的表,子表是添加了外鍵了的表,註意,在創建表的時候可以添加外鍵,也可以創建完了以後

MySQL之SQL優化實戰記錄

背景 本次SQL優化是針對javaweb中的表格查詢做的。 部分網路架構圖   業務簡單說明 N個機臺將業務資料傳送至伺服器,伺服器程式將資料入庫至MySQL資料庫。伺服器中的javaweb程式將資料展示到網頁上供使用者檢視。 原資料庫設計 wind

MySQL索引優化

概念 索引儲存在記憶體中,為伺服器儲存引擎為了快速找到記錄的一種資料結構。 基本操作 為資料表新增索引: ALTER TABLE table_name ADD INDEX index_name (column_list) //普通索引 ALTER TABLE table_

mysql 索引索引建立原則

是什麼   索引用於快速的查詢某些特殊列的某些行。如果沒有索引, MySQL 必須從第一行開始,然後通過搜尋整個表來查詢有關的行。表越大,查詢的成本越大。如果表有了索引的話,那麼 MySQL 可以很快的確定資料的位置,而不用查詢整個表格。這比順序的讀取每一行要快的多。索引就像我們查字典時的目錄一樣,我們通過

MySQL規範優化

1、基本規則     1.1 、儘量不在資料庫做運算      運算儘可能移到程式端CPU。     1.2、 控制單表資料量      1.2.1、一年內的單表資料量預估       >純INT不超過1000W       >含CHAR不超過500

MySQL索引合併優化

如果沒有索引合併, 則在多個單列索引中優化器只會選取最有的一個索引使用, 其餘的索引將捨棄 根據官方文件中的說明,我們可以瞭解到: 1、索引合併是把幾個索引的範圍掃描合併成一個索引。 2、索引合併的時候,會對索引進行並集,交集或者先交集再並集操作,以便合併成一個索引。