1. 程式人生 > >mysql 寫出高效能sql 防止索引失效總結

mysql 寫出高效能sql 防止索引失效總結

資料庫調優步驟:

1)首先檢視慢查詢日誌,找到有問題的 sql 語句   2)利用 explain 檢視各個屬性的狀態   3)利用 show profile  4)檢視資料庫內部各個關鍵節點的配置

1、索引是排好序的能夠實現快速查詢的資料結構,因此對於複合索引來說,mysql會根據建立索引的順序對資料庫表進行排序,因此如果某個sql語句沒有按照建立索引的順序操作欄位的話,索引的使用情況必然受到影響,比如建立複合索引 abc,其中 b 沒用上,那麼本來根據 b 排好序的後面的排序同樣也就失效了。索引是儲存在磁碟上的一種檔案,是和資料庫表在物理上分開而邏輯上相連的一種資料結構

where 後跟的是查詢條件,order by 後面跟的是排序條件,一般都會在這兩者身上用索引,而且這兩者都遵循最佳左字首法則

mysql 支援兩種排序方式:1)using index ;2)using filesort,當然要儘量避免後者,儘可能多的使用前者

2、B樹不一定都是二叉樹,而叫多路搜尋樹,大多數是B樹索引,也有hash索引等其他的索引

3、索引分為:單值索引、唯一索引和複合索引,唯一索引只是加在索引上的一種限制,比如某一個列被
建立成了索引,而且加上了唯一索引的限制(UNIQUE),那麼該索引列上的所有的值必須不能重複,都是

唯一的,如果不加唯一索引限制,是可以重複的

4、索引缺點:1、索引也是一張表,佔用磁碟空間  2、加上索引提高了資料的搜尋速度,但是減慢了
資料的增刪改的速度,因為一旦資料表中的資料發生變化,如果變化的列恰好也是索引列,那相應的索引
也要發生更改

5、經常更新的欄位不要建索引,重複率太高的欄位不要建索引,可以用一個公式來衡量一個列建立索引的選擇性:一個列中不同值的數量/該列總記錄的數量

6、mysql 是怎麼優化的?

執行 EXPLAIN 關鍵字 + SQL 語句得到:

id   select_type    table    possible_keys     key      key_len     ref     rows     Extra

7、要麼別建索引,如果建索引,則group by 的順序一定要和建索引的順序相同,來避免產生:Extra 屬性裡面出現:using filesort 和 using temporary,特別是不要出現後者

8、在範圍索引後面的索引是不起作用的(失效索引)

9、左連線的時候,在右表建立索引,右連線的時候,在左表建立索引,如:
select * from employee LEFT JOIN dept on employee.deptID = dept.id

(員工表的部門 ID 等於部門表的主鍵 ID)這是一個左連線,employee 當做左表,dept 當做右表,所以需要在 dept 上建立索引如:alter table ‘dept’ ADD INDEX Y ('id')

10、索引最好建立在需要經常查詢的欄位中,對於JOIN 的優化,永遠用小表驅動大表,也就是小表要在左邊,大表在右邊

11、優先優化內層子查詢,也就是帶括號的查詢,只有內層查詢快了,外層查詢才能加速

12、如果用 explain 解析的 sql 語句的 key 屬性值為 NULL,則有兩種可能,一種是沒建立索引第二是雖然建立了索引,但是索引失效

13、對於複合索引(一個表中同時建立的多個索引,如:create INDEX abc on Employee(a,b,c)),口訣是:
帶頭大哥不能倒:意思就是按索引建立的順序,第一個被建立的索引列必須要用上,否則後面的索引不論怎麼組合或者單獨使用都是無效(也叫做最佳左字首法則)
中間兄弟不能斷:意思是不能隔空只用,比如沒有用到中間的 b,而是使用的 a 和 c,則 c 索引失效,a 可以正常使用


14、範圍之後全失效,比如:
select * from Employee Where name=July AND age>25 AND position=manager
這個 sql 中用到了 age>25 這個範圍,所以 mysql 就會在這個索引層進行查詢,後面的 position就失效了


15、儘量在索引列內做查詢,少用 select *,比如可以用: 
select a,b from Employee Where name=July AND age>25 AND position=manager


16、當使用不等於符號(!=或者<>)或者is NULL,或者 is not NULL的時候,會導致索引失效,全表掃描

****覆蓋索引:查詢的時候,選擇的查詢欄位與建立複合索引的欄位的名稱相同,如果在查詢的時候,查詢欄位的順序和建立覆蓋索引的順序不一樣,索引也能夠正常使用,由於在 mysql 架構的第二層有一個優化器,會自動把順序調整過來,所以一般要按照建立複合索引的順序寫查詢欄位,避免了一次資料庫內部優化的過程,比如:

create INDEX abcd on Employee(a,b,c,d);

select   a,b,c,d   from Employee Where a=1,b=2,c=2,d=0 和 select    a,b,c,d    from Employee Where a=1,b=2,d=0,c=2

這兩條 sql 的 explain 結果是相同的,只是第二條 sql 在 mysql 內部做了一次優化,先把 Where 後面的順序根據建立複合索引的順序排好 

17、like 查詢最好把 % 加在右邊:百分like加右邊,而且查詢的explain 屬性 type 值為 range ,否則,加在左邊或者兩邊都加,索引會失效,如果非要在兩邊加 % 才能保證資料的準確性,則需要建立覆蓋索引才能達到索引不失效,所謂覆蓋索引,也就是查詢的時候,選擇的查詢欄位與建立複合索引的欄位的名稱相同,當然選擇複合索引的其中某幾個作為查詢欄位,索引也不會失效,但是如果是 select * 或者是查詢的欄位中包含非複合索引欄位,則建立的複合索引會失效,比如:
create INDEX abc on Employee (a,b,c);
select a,b,d from Employee Where name like %aa%;
其中 d 欄位不是複合索引中的欄位,因此該查詢仍然是全表掃描,索引失效


18、字串不加單引號索引會失效,比如:
select * from Employee Where name='2000',該 sql 的索引不會失效,但是如果2000上不加單引號,雖然能夠查到結果,(mysql 在內部做了一個隱式的轉換,把int型轉為 string 型),但是索引會失效


19、少用 or,用 or 也會導致索引失效

20、使用 order by 防止索引失效和防止產生 filesort 的方法,提高 order by 的速度:



21、最佳左字首法則


相關推薦

mysql 高效能sql 防止索引失效總結

資料庫調優步驟:1)首先檢視慢查詢日誌,找到有問題的 sql 語句   2)利用 explain 檢視各個屬性的狀態   3)利用 show profile  4)檢視資料庫內部各個關鍵節點的配置1、索引是排好序的能夠實現快速查詢的資料結構,因此對於複合索引來說,mysql會

優化SQL查詢:怎樣高效能SQL語句

1、 首先要搞明白什麼叫執行計劃? 執行計劃是資料庫根據SQL語句和相關表的統計資訊作出的一個查詢方案,這個方案是由查詢優化器自動分析產生的,比如一條SQL語句如果用來從一個 10萬條記錄的表中查1條記錄,那查詢優化器會選擇“索引查詢”方式,如果該表進行了歸檔,當前只剩下5000條記錄了

優化SQL查詢:如何高效能SQL語句

1、 首先要搞明白什麼叫執行計劃? 執行計劃是資料庫根據SQL語句和相關表的統計資訊作出的一個查詢方案,這個方案是由查詢優化器自動分析產生的,比如一條SQL語句如果用來從一個 10萬條記錄的表中查1條記錄,那查詢優化器會選擇“索引查詢”方式,如果該表進行了歸檔,當前只剩

SQL 語句效率問題(如何高效能SQL語句)

1.關於SQL查詢效率,100w資料,查詢只要1秒,與您分享: 機器情況 p4: 2.4 記憶體: 1 G os: windows 2003 資料庫: ms sql server 2000 目的: 查詢效能測試,比較兩種查詢的效能 SQL查詢效率 step by step

高效能的JQuery

一個糟糕的Jquery可能會影響到整個頁面的渲染更或是請求耗時很長,這樣的網頁展示,我想是使用者不願意看到的。 1.取消沒必要的頻繁的獲取Jquery物件,這個在Java程式設計裡我想一樣: [

MySQL隱式型別轉換導致索引失效

今天發現一個問題,where條件的列上明明有索引,但是執行計劃還是走全表掃描 mysql>  explain select task_id FROM mostop_xiaodai_collection_call_auto WHE

怎樣高效能的 Java 程式碼?

在這篇文章中,我們將討論幾個有助於提升Java應用程式效能的方法。我們首先將介紹如何定義可度量的效能指標,然後看看有哪些工具可以用來度量和監控應用程式效能,以及確定性能瓶頸。 我們還將看到一些常見的Java程式碼優化方法以及最佳編碼實踐。最後,我們將看看用於提升Java應用程式效能的JVM調優技巧和架構調整

深入理解 GIL:如何高效能及執行緒安全的 Python 程式碼

6歲時,我有一個音樂盒。我上緊發條,音樂盒頂上的芭蕾舞女演員就會旋轉起來,同時,內部裝置發出“一閃一閃亮晶晶,滿天都是小星星”的叮鈴聲。那玩意兒肯定俗氣透了,但我喜歡那個音樂盒,我想知道它的工作原理是什麼。後來我拆開了,才看到它裡面一個簡單的裝置,機身內部鑲嵌著一個拇指大小的金

怎麼避免SQL

在大多數實際的系統中,慢 SQL 消耗掉的資料庫資源,往往是正常 SQL 的幾倍、幾十倍甚至幾百倍。 怎樣才能在開發階段儘量避免寫出慢 SQL 呢? ### 估算資料量 慢 SQL 對資料庫的影響,是一個量變到質變的過程,對“量”的把握,就很重要。編寫一條查詢語句的時候,可以依據你要查詢資料表的資料總量,

建立索引後,速度變快原因?以及索引失效總結

總結自韓順平老師教學 速度變快是因為搜尋引擎的選擇,一般是Btree,二叉樹的話是logn的時間複雜度; 索引失效的總結。以下是具體描述。 原理示意圖:   .   索引使用的注意事項 索引的代價: 佔用磁碟空間 對dml

避免不走索引SQL, MySQL

故,如果需要計算,千萬不要計算到索引列,想方設法讓其計算到表示式的另一邊去。 索引列使用了函式 同樣的道理,索引列使用了函式,一樣會導致相同的後果 SELECT `sname` FROM `stu` WHERE concat(`sname`,'abc') ='Jaskeyabc'; -- 不會使用索引,因為使

怎麼SQL才能使Oracle的索引失效

 1. 沒有 WHERE 子句   2. 使用 IS NULL 和 IS NOT NULL   SELECT ... FROM emp WHERE comm IS NULL; comm 列的索引會失效   3. WHERE 子句中使用函式   如果沒有使用基於函式的索

spark-sql使用UDF函式實現ip對映省份,資料mysql引數設定。

spark-SQL使用廣播變數以及應用資料庫的UDF自定義函式的查詢會比兩張表的連線更加的優化的程式的執行。 兩表連線是比較費效率的。 spar-sql 2.x的資料讀取,處理,新增schema資訊,常見表,SQL查詢。 將sql結果輸出到mysql的api引數設定。  還

win處navicat直接導sql腳本導入Linux mysql報錯問題

錯誤 www. nbsp 提取 xxx .com 根目錄 打開 win 最近幾天在把win上的項目的數據庫轉移到Ubuntu,於是第一件事就是從win處的navicat直接導出sql腳本,然後進入Ubuntu導入的時候會報錯誤,跳過錯誤繼續執行導致數據庫表的缺失。 跨平臺錯

MySQL索引失效的幾種情況

模糊 運算 全表掃描 mysq 子節點 葉子節點 數據 都是 記錄 1.索引不存儲null值 更準確的說,單列索引不存儲null值,復合索引不存儲全為null的值。索引不能存儲Null,所以對這列采用is null條件時,因為索引上根本 沒Null值,不能利用到索引,只能全

MySQL優化(5):索引失效分析、in與exists使用場合

有一個 來替 null 決定 index idt class 分布 family 一、索引失效的情況   前文提及過可以通過explain的possible_keys、key屬性判斷索引是否失效,key如果為null,可能是索引沒建,也可能是索引失效,下面列舉一些會使索引失

MySQL存儲引擎 SQL數據導入/導 操作表記錄 查詢及匹配條件

shel 關鍵字 other shu right term appears logging 5.6 MySQL存儲引擎的配置 SQL數據導入/導出 操作表記錄 查詢及匹配條件 1 MySQL存儲引擎的配置1.1 問題 本案例要求MySQL數據存儲引擎的使用,完成以下任務操作

mysql索引失效

width 優化 c89 使用 files tle index ddd sha 一、成功的索引優化1.表數據如下:2.查詢語句如下:explain select id, age, level from employee where dpId = 1 and age = 30

SQL SERVER全面優化-------好語句是習慣

end .com 數據源 exp inf 找到 預警 連接 系列 重中之重---語句執行順序   在QQ群和人聊天的時候突然有位群友說:我才知道原來語句走索引是按照select 的字段篩選的! 振振有詞,非常肯定!另一個群友反問update呢 ? 看起來很小白的問題

MySQL— pymysql模塊(防止sql註入),可視化軟件Navicat

字典類 open weight 學習 增加 所有 avi isp 實現 一.Pymysql import pymysql #python2.X 中是 mysqldb 和 pythonmysql 用法是一模一樣的 #pymysql可以偽裝成上面這兩個模塊