1. 程式人生 > >mysql慢查詢原因分析與解決(三)——索引及查詢優化

mysql慢查詢原因分析與解決(三)——索引及查詢優化

索引的型別

Ø 普通索引:這是最基本的索引型別,沒唯一性之類的限制。

Ø 唯一性索引:和普通索引基本相同,但所有的索引列值保持唯一性。

Ø 主鍵:主鍵是一種唯一索引,但必須指定為”PRIMARY KEY”。

Ø 全文索引:MYSQL從3.23.23開始支援全文索引和全文檢索。在MYSQL中,全文索引的索引型別為FULLTEXT。全文索引可以在VARCHAR或者TEXT型別的列上建立。

大多數MySQL索引(PRIMARY KEY、UNIQUE、INDEX和FULLTEXT)使用B樹中儲存。空間列型別的索引使用R-樹,MEMORY表支援hash索引。

單列索引和多列索引(複合索引)

索引可以是單列索引,也可以是多列索引。對相關的列使用索引是提高SELECT操作效能的最佳途徑之一。

多列索引:

MySQL可以為多個列建立索引。一個索引可以包括15個列。對於某些列型別,可以索引列的左字首,列的順序非常重要。

多列索引可以視為包含通過連線索引列的值而建立的值的排序的陣列。一般來說,即使是限制最嚴格的單列索引,它的限制能力也遠遠低於多列索引。

最左字首

多列索引有一個特點,即最左字首(Leftmost Prefixing)。假如有一個多列索引為key(firstname lastname age),當搜尋條件是以下各種列的組合和順序時,MySQL將使用該多列索引:

firstname,lastname,age

firstname,lastname

firstname

也就是說,相當於還建立了key(firstname lastname)和key(firstname)。

索引主要用於下面的操作:

Ø 快速找出匹配一個WHERE子句的行。

Ø 刪除行。當執行聯接時,從其它表檢索行。

Ø 對具體有索引的列key_col找出MAX()或MIN()值。由前處理器進行優化,檢查是否對索引中在key_col之前發生所有關鍵字元素使用了WHERE key_part_# = constant。在這種情況下,MySQL為每個MIN()或MAX()表示式執行一次關鍵字查詢,並用常數替換它。如果所有表示式替換為常量,查詢立即返回。例如:

SELECT MIN(key2), MAX (key2) FROM tb WHERE key1=10;

Ø 如果對一個可用關鍵字的最左面的字首進行了排序或分組(例如,ORDER BY key_part_1,key_part_2),排序或分組一個表。如果所有關鍵字元素後面有DESC,關鍵字以倒序被讀取。

Ø 在一些情況中,可以對一個查詢進行優化以便不用查詢資料行即可以檢索值。如果查詢只使用來自某個表的數字型並且構成某些關鍵字的最左面字首的列,為了更快,可以從索引樹檢索出值。

SELECT key_part3 FROM tb WHERE key_part1=1

有時MySQL不使用索引,即使有可用的索引。一種情形是當優化器估計到使用索引將需要MySQL訪問表中的大部分行時。(在這種情況下,表掃描可能會更快些)。然而,如果此類查詢使用LIMIT只搜尋部分行,MySQL則使用索引,因為它可以更快地找到幾行並在結果中返回。

合理的建立索引

(1) 越小的資料型別通常更好:越小的資料型別通常在磁碟、記憶體和CPU快取中都需要更少的空間,處理起來更快。

(2) 簡單的資料型別更好:整型資料比起字元,處理開銷更小,因為字串的比較更復雜。在MySQL中,應該用內建的日期和時間資料型別,而不是用字串來儲存時間;以及用整型資料型別儲存IP地址。

(3) 儘量避免NULL:應該指定列為NOT NULL,除非你想儲存NULL。在MySQL中,含有空值的列很難進行查詢優化,因為它們使得索引、索引的統計資訊以及比較運算更加複雜。你應該用0、一個特殊的值或者一個空串代替空值

SQL語句注意點

1. 當結果集只有一行資料時使用LIMIT 1

2. 避免SELECT *,始終指定你需要的列

從表中讀取越多的資料,查詢會變得更慢。他增加了磁碟需要操作的時間,還是在資料庫伺服器與WEB伺服器是獨立分開的情況下。你將會經歷非常漫長的網路延遲,僅僅是因為資料不必要的在伺服器之間傳輸。

3. 使用連線(JOIN)來代替子查詢(Sub-Queries)

連線(JOIN).. 之所以更有效率一些,是因為MySQL不需要在記憶體中建立臨時表來完成這個邏輯上的需要兩個步驟的查詢工作。

4. 使用ENUM、CHAR 而不是VARCHAR,使用合理的欄位屬性長度

5. 儘可能的使用NOT NULL

6. 固定長度的表會更快

7. 拆分大的DELETE 或INSERT 語句

8. 查詢的列越小越快

Where條件

在查詢中,WHERE條件也是一個比較重要的因素,儘量少並且是合理的where條件是很重要的,儘量在多個條件的時候,把會提取儘量少資料量的條件放在前面,減少後一個where條件的查詢時間。

有些where條件會導致索引無效:

Ø where子句的查詢條件裡有!=,MySQL將無法使用索引。

Ø where子句使用了Mysql函式的時候,索引將無效,比如:select * from tb where left(name, 4) = ‘xxx’

Ø 使用LIKE進行搜尋匹配的時候,這樣索引是有效的:select * from tbl1 where name like ‘xxx%’,而like ‘%xxx%’ 時索引無效


相關推薦

mysql查詢原因分析解決——索引查詢優化

索引的型別 Ø 普通索引:這是最基本的索引型別,沒唯一性之類的限制。 Ø 唯一性索引:和普通索引基本相同,但所有的索引列值保持唯一性。 Ø 主鍵:主鍵是一種唯一索引,但必須指定為”PRIMARY KEY”。 Ø 全文索引:MYSQL從3.23.23開始支援全

資料庫鎖表的分析解決

ORACLE裡幾種鎖模式 遇到一個多事務併發的問題 mysql資料庫鎖 推薦圈子: Pipboy 更多相關推薦 對鎖機制的研究要具備兩個條件: 1.資料量大 2.多個使用者同時併發 如果缺少這兩個條件,資料庫不容易產生死鎖問題。研究起來可能會事倍功半。如果這兩個條件都有,但

資料庫鎖表的分析解決

SQL Server的鎖機制一. 為什麼要引入鎖 多個使用者同時對資料庫的併發操作時會帶來以下資料不一致的問題: 丟失更新 A,B兩個使用者讀同一資料並進行修改,其中一個使用者的修改結果破壞了另一個修改的結果,比如訂票系統 髒讀 A使用者修改了資料,隨後B使用者又讀出該資料

SQL Server索引進階第十一篇:索引碎片分析解決

索引設計是資料庫設計中比較重要的一個環節,對資料庫的效能其中至關重要的作用,但是索引的設計卻又不是那麼容易的事情,效能也不是那麼輕易就獲取到的,很多的技術人員因為不恰當的建立索引,最後使得其效果適得其反,可以說“成也索引,敗也索引”。 相關有關索引碎片的問題,大家應該是聽過不少,也許也很多的朋友

SQL註入漏洞的分析利用

和數 form 打開 用戶 data 用戶名 text 必須 存儲 MySQL數據庫: 元數據庫information_schema1.在5.0以後版本的MySQL中存在著一個元數據庫information_schema,其中存儲著用戶在MySQL中創建的所有其他數據庫的信

python進階之資料分析展示

資料分析之表示 資料存取與函式 資料的CSV檔案存取 CSV (Comma‐Separated Value, 逗號分隔值) CSV是一種常見的檔案格式,用來儲存批量資料。 np.savetxt(frame, array, fmt=’%.

redis原始碼分析思考——字典中鍵的兩種hash演算法

      在Redis字典中,得到鍵的hash值顯得尤為重要,因為這個不僅關乎到是否字典能做到負載均衡,以及在效能上優勢是否突出,一個良好的hash演算法在此時就能發揮出巨大的作用。而一個良好的has

Makefile:14: *** missing separator. Stop. 原因分析解決

問題描述: 本人在做朱老師一步步點亮LED實驗時,想通過make命令執行windows中寫好的makefile檔案時,發現 問題分析: 遇到這個問題,本人首先檢查了交叉編譯了是否安裝成功,檢視發現安裝成功,然後再查看了linux中交叉編譯鏈環境變數是否安裝正常。經過

mysql報錯 DuplicateKeyException分析解決

在做資料庫同步的時候,發現一個錯誤,mysql報錯如下: org.springframework.dao.DuplicateKeyException: ### Error updating database. Cause: com.mysql.jdbc.exce

NUMA導致的MySQL伺服器SWAP問題分析解決方案

【SWAP產生原理】 先從swap產生的原理來分析,由於linux記憶體管理比較複雜,下面以問答的方式列了一些重要的點,方便大家理解:  1、swap是如何產生的 swap指的是一個交換分割槽或檔案,主要是在記憶體使用存在壓力時,觸發記憶體回收,這時可能會將部分記憶體的資料交換到swap空間。  2、

在命令列下編譯通過,執行時提示錯誤:找不到或無法載入主類的原因分析解決方式

有時候我們需要直接用jdk提供的java命令來執行class檔案讓軟體執行起來,特別是很多初學者,但經常會發現如下提示: 用eclipse或用ant則沒有問題。 其實原因很簡單,我們忽略了2個細節。 1.java指令預設在尋找class檔案的地址是通過CLASSPATH環境變數中指定的目錄中尋找的。 2.

77.下拉重新整理MJRefresh和UITableView的section headerView衝突的原因分析解決方案

首先修改MJRefreshHeader.h 中的這個  目的是當HeadView已經處於當前螢幕頂端 時不要執行動畫  直接設定偏移量為64 // 恢復inset和offset if (self.

轉:MySQL下載安裝、配置使用win7x64

服務端 oot 路徑 source password ade cto 麻煩 全部 1 第一大步:下載。 a.俗話說:“巧婦難為無米之炊”嘛!我這裏用的是 ZIP Archive 版的,win7 64位的機器支持這個,所以我建議都用這個。因為這個簡

MySQLOracle---日期對比Oracle

數據庫 alt to_date pan 技術分享 時間日期 軟件 floor lte Oracle: 1.獲取當前日期的年,月,日,時,分,秒 select to_char(sysdate,‘yyyy‘) as nowYear from dual; //獲取時間

【轉載】TCP粘包問題分析解決

刪除 而且 實例 報文 底層 nagle 存在 ngxin 想想 TCP通信粘包問題分析和解決(全) 在socket網絡程序中,TCP和UDP分別是面向連接和非面向連接的。因此TCP的socket編程,收發兩端(客戶端和服務器端)都要有成對的socket,因此,發送端為了將

SQL註入漏洞的分析利用

ces mysql 得出 必須 排序 快速搭建 oracle 學習筆記 min SQL註入的核心思想 黑客在正常的需要調用數據庫的URL後面構造一段數據庫查詢代碼,然後根據返回的結果,從而獲得想要的某些數據。SQL結構化查詢語言,絕大多數關系型數據庫(MySQL、Acces

SQL註入漏洞的分析利用

manage 如果 得到 nio 學習筆記 sql註入 .com 密碼 vpd Access手工註入 1.實驗環境:實驗平臺:小旋風ASPWeb服務器目標網站:南方數據2.02.打開網站,隨意點開一個頁面看到?id=4說明有參數傳遞,用的是get方法,可能是一個註入點加入判

FreeCodeCamp( FCC)前端工程師 中級算法練習 分析解答(精)

前端工程師 doc html agents fad asc -keep tps nts [TOC] 說在前面 這是要一篇非常簡單的新手能看懂的文章,希望你喜歡。由於在 freecodecamp 中貌似!?無法使用 ES6 的某些語法,未測試具體。所以基本上用古老?!的ES5

TCP粘包問題分析解決

TCP通訊粘包問題分析和解決(全) 在socket網路程式中,TCP和UDP分別是面向連線和非面向連線的。因此TCP的socket程式設計,收發兩端(客戶端和伺服器端)都要有成對的socket,因此,傳送端為了將多個發往接收端的包,更有效的發到對方,使用了優化方法(Nagle演算法)

redis原始碼分析思考十三——字串型別的命令實現(t_string.c)

    在對字串操作的命令中,主要有增加刪查該、批處理操作以及編碼的轉換命令,現在列出對字串物件操作的主要常用命令: 常用命令表 命令 對應操作 時間複雜度