Database — 八個 Index( 索引 ) 無法生效的 SQL 寫法

 Database — 八個 Index( 索引 ) 無法生效的 SQL 寫法


相信許多讀者一定知道 Index,也就是索引,對於資料庫的重要性,可以說一個資料庫執行效能的第一道關卡,就是將索引設定恰當。
不過相信很多朋友知道要使用索引後,執行的 SQL 語句如果包含被設定索引的欄位,則速度會變快。但可能不太清楚在什麼情況下,速度不會變快
因此,今天想跟各位朋友介紹,八個常見,但會導致 index 無法作用的 SQL 寫法,希望能幫助各位更恰當的編寫 SQL 語句:

1. 使用 NOT 、!=、not in、not like 等負向判斷詞
SELECT * FROM users WHERE name != 'John';

2. 使用函數語句包裝被索引的欄位
SELECT * FROM users WHERE DATE(created_at) = '2022-02-28';

這邊的範例使用 DATE() 函數,去轉換 created_at 這個欄位,因而導致無法透過原始資料,去觸發索引機制。
這邊要幫大家建構一個概念,索引會失效很重要的核心問題就是,『不要對欄位動手腳』,後續會用其他例子幫大家更釐清會有什麼情境。

3. 資料類型錯誤
SELECT * FROM users WHERE age = 30;

這邊假設 age 設定 varchar ,也就是字串型別,則 SQL 在判斷時,會『偷偷的』去做類別轉換,也就是對欄位動手腳,就會導致索引失效

4. 使用 『 %XXX% 』或是 『 %XXX 』
SELECT * FROM users WHERE name like '%john%';
失效的原因,是因為索引運算機制中,有部分會從字元最左開始匹配,如果用範例的搜尋模式,『 最左 』的字元會無法匹配,導致失效。

5. 使用 Null
SELECT * FROM users WHERE name IS NULL;
Null 值對於 Index 資料管理來說是比較迥異的存在,所以通常預設是不支援的,但在部份資料庫軟體中,可以另外設定讓 Null 被納入索引中

6. 錯誤的使用 or
SELECT * FROM users WHERE indexed_column > 5 or unindexed_column < 10;

上面的語句中, indexed_column 是有被加入索引的欄位,而 unindexed_column 是沒有被加入索引的欄位。如果 query 語句中,含有沒有被加入索引的欄位,則索引不會生效

7. 針對索引欄位做運算
SELECT * FROM users WHERE height - 10 > 150;
這邊可以再帶回我們上面強調的概念,對欄位動手腳的話,索引即不會生效,所以上面的例子中,對 height 做了運算,會導致索引無效。

8. 複合式 INDEX 使用順序錯誤
假設有三個欄位合起來的索引,name + height + weight
SELECT * FROM users WHERE name = 'john' and weight > 100;

上面語句的問題是,我們的索引是從 name 起頭,再來是 height,可是這個語句直接先接上了 weight,就會導致索引失效。
所以上面語句合法的索引組合有三:
name + height + weight
name + height
name

跳脫這三者的排序,則會讓索引失效喔

Reference https://medium.com/johnliu-%E7%9A%84%E8%BB%9F%E9%AB%94%E5%B7%A5%E7%A8%8B%E6%80%9D%E7%B6%AD/database-%E5%85%AB%E5%80%8B-index-%E7%B4%A2%E5%BC%95-%E7%84%A1%E6%B3%95%E7%94%9F%E6%95%88%E7%9A%84-sql-%E5%AF%AB%E6%B3%95-cdc7d2e72f51

留言

這個網誌中的熱門文章

Json概述以及python對json的相關操作

Docker容器日誌查看與清理

遠程控制管理工具ipmitool