1. 程式人生 > >Mysql之索引失效

Mysql之索引失效

【優化口訣】
 全值匹配我最愛,最左字首要遵守;
 帶頭大哥不能死,中間兄弟不能斷;
 索引列上少計算,範圍之後全失效;
 LIKE百分寫最右,覆蓋索引不寫*;
 不等空值還有OR,索引影響要注意;
 VAR引號不可丟, SQL優化有訣竅。

解析索引失效案例:

前提建立了一個複合索引:ALTER TABLE staffs ADD INDEX idx_staffs_nameAgePos(name, age, pos);

1、全值匹配我最愛


EXPLAIN SELECT * FROM staffs WHERE NAME = 'July';
EXPLAIN SELECT * FROM staffs WHERE NAME = 'July' AND age = 25;
EXPLAIN SELECT * FROM staffs WHERE NAME = 'July' AND age = 25 AND pos = 'dev';
 

2、最左字首要遵守

如果索引了多列,要遵守最左字首法則。指的是查詢從索引的最左前列開始並且不跳過索引中的列。

3、帶頭大哥不能死,中間兄弟不能丟

如上面的:EXPLAIN SELECT * FROM staffs WHERE age = 25 AND pos = 'dev';此時的索引的第一個name沒有,則不能使用索引

EXPLAIN SELECT * FROM staffs WHERE name='Jack' AND pos = 'dev';此時跳過了索引age,則只能用上name,後面的pos不能用。

4、索引列上少計算

不在索引列上做任何操作(計算、函式、(自動or手動)型別轉換

),會導致索引失效而轉向全表掃描

其中後面那句varchar引號不能丟也是如此,如果是丟了,則會進行自動型別轉換,就相當於計算。

5、範圍之後全失效

儲存引擎不能使用索引中範圍條件右邊的列,

比如在索引中有一個索引用的是大於小於等這樣子的範圍值,那麼包括這個索引是有效的,之後的索引失效

6、like百分寫最右

like以萬用字元開頭('%abc...')mysql索引失效會變成全表掃描的操作

7、覆蓋索引不寫*

儘量使用覆蓋索引(只訪問索引的查詢(索引列和查詢列一致)),減少select *

8、不等空值還有or,索引影響要注意

1)、mysql 在使用不等於(!= 或者<>)的時候有時候無法使用索引

會導致全表掃描

2)、少用or,用它來連線時會索引失效

3)注意null/not null對索引的可能影響

9、 VARchar引號不可丟

相關推薦

Mysql索引失效

【優化口訣】  全值匹配我最愛,最左字首要遵守;  帶頭大哥不能死,中間兄弟不能斷;  索引列上少計算,範圍之後全失效;  LIKE百分寫最右,覆蓋索引不寫*;  不等空值還有OR,索引影響要注意;  VAR引號不可丟, SQL優化有訣竅。 解析索引失效案例: 前提建立了

MySQL高階 索引失效與優化詳解

案例所用的表結構、索引、與資料如下: 索引失效與優化 1、全值匹配我最愛 2、最佳左字首法則(帶頭索引不能死,中間索引不能斷) 如果索引了多個列,要遵守最佳左字首法則。指的是查詢從索引的最左前列開始 並且 不跳過索引中的列。  正確的示例參考上圖。 錯誤的示例: 

Mysql 索引優化及索引失效

1.最佳左字首法則-如果索引了多列,要遵守最左字首法則.指的是查詢從索引的最左前列開始並且不跳過索引中的列. 2.不在索引上左任何操作(計算,函式,(自動or手動)型別轉換),會導致索引失效而轉向全表掃描 3.儲存引擎不能使用索引中範圍條件右邊的列 4.儘量使用覆蓋索引

MySQL索引

var 也不能 oss 標題 數據結構 部分 normal 訪問 spa 索引(在MySQL中也叫鍵(key))是存儲引擎用於快速找到記錄的一種數據結構。 索引類型有:Normal,Unique,FullText。 索引方法有:BTREE、HASH。 我有一個user_

MySQL索引詳解

分布 i/o .cn 能夠 b+ images 電路 普通 磁道 這篇博客將要闡述為什麽使用b+樹作為索引,而不是b樹或者其他樹 1.什麽是b樹

MySQL 索引原理與慢查詢優化

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

Mysql索引優化

字符 span 等於 select not clas 存儲引擎 自動 無法使用 1.如果索引了多列,要遵守最左前綴法則,指的是查詢從索引的最左前列開始並且不跳過索引中的列。 2.不在索引上做任何操作(計算、函數、(自動or手動)類型轉換),會導致索引丟失而轉向全表掃描

mysql索引失效

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

Mysql索引介紹

isam \n 如何使用 p s 設計原則 n) 所有 順序 數據文件 定義:索引用於快速找出某個列中有一特定值的行。不使用索引,MySql必須從第一條記錄開始讀完整個表,直到找出相關的行。表越大,查詢數據所花費的時間越多。如果表中查詢的列有一個索引,Mysql能快速到達一

MySQL索引復合索引有效性

dex rim reat 索引 結果 default int prim charset 首先這裏建立一張數據表,並建立符合索引( index_A,index_B,index_C) CREATE TABLE `test_index_sequence` ( `Id` int(

MySQL索引(三)

聚簇索引 聚簇索引並不是一種單獨的索引型別,而是一種資料儲存方式。具體的細節依賴於其實現方式,但InnoDB的聚簇索引實際上在同一個結構中儲存了B-Tree索引和資料行。當表有聚簇索引時,它的資料行實際上存放在索引的葉子頁(leaf page)中。術語“聚簇”表示資料行和相鄰的鍵值緊湊地儲存在一起。因為無法

MySQL索引(二)

高效能的索引策略 正確地建立和使用索引是實現高效能查詢的基礎。在MySQL之索引(一)這一章中我們介紹了各種型別的索引及其對應的優缺點。現在我們一起來看看如何真正地發揮這些索引的優勢。 獨立的列 我們通常會看到一些查詢不當地使用索引,或者使得MySQL無法使用已有的索引。如果查詢中的列不是獨立的,則My

mysql索引(一)

組合索引 pri drop weight var unique 分享圖片 bold key -- 有了表之後單獨為這個表的字段追加一個普通索引的方法,為t1表的id字段創建一個普通索引,起名為idx_id create index idx

mysql索引原理與慢查詢優化

一、介紹 1.什麼是索引? 一般的應用系統,讀寫比例在10:1左右,而且插入操作和一般的更新操作很少出現效能問題,在生產環境中,我們遇到最多的,也是最容易出問題的,還是一些複雜的查詢操作,因此對查詢語句的優化顯然是重中之重。說起加速查詢,就不得不提到索引了。 2.為什麼

MySQL索引原理

  一、索引原理   1,什麼是索引?   索引在MySQL中也叫‘鍵’或者‘key’,是儲存引擎用於快速找到記錄的一種資料結構。索引對於良好的效能非常關鍵,尤其是當表中的資料量越來越大時,索引對於效能的影響愈發重要,減少IO次數,加快查詢。   2,索引的資料結構:b+樹   上圖就是一個b+樹

MySQL索引(四)

壓縮索引 MyISAM使用字首壓縮來減少索引的大小,從而讓更多的索引可以放入記憶體中,這在某些情況下能極大地提高效能。預設只壓縮字串,但通過引數設定也可以對整數做壓縮。 MyISAM壓縮每個索引塊的方法是,先完全儲存索引塊中的第一個值,然後將其他值和第一個值進行比較得到相同字首的位元組數和剩餘的不同字尾部

MySQL索引原理和慢查詢優化

1. 索引介紹 需求:   一般的應用系統,讀寫比例在10:1左右,而且插入操作和一般的更新操作很少出現效能問題,在生產環境中,我們遇到最多的,也是最容易出問題的,還是一些複雜的查詢操作,因此對查詢語句的優化顯然是重中之重。說起加速查詢,就不得不提到索引了。 索引:    簡單的說,相當於

Mysql索引失效(應避免)(十)

https://blog.csdn.net/qq_29347295/article/details/79112102 版權宣告:本文為博主原創文章,未經博主允許不得轉載。    https://blog.csdn.net/qq_29347295/article/de

Mysql引起索引失效的原因總結

在資料庫中做查詢等操作,經常發現查詢很慢,但是已經在列上建了索引,最後經過研究發現,很多種情況引起了索引失效。 下面就對遇到的引起索引失效的原因做一下總結(不包括索引本身無效的情況),歡迎博友們補充。 1、對單欄位建了索引,where條件多欄位。 例:建了以下索引: 查詢

mysql 時間索引失效

專案中查詢時間斷的資料發現查詢時間很長。懷疑沒有走時間的索引,於是explain一下 EXPLAIN select * from t_order where created_at>'2015-01-01 00:00:00' and created_at<'201