索引的概念
索引具被,可以理解為一種特殊的目錄。就好比我們看書或者查字典蚓再,只需要查目錄灶泵,就能迅速定位到需要的內容,這樣遠比從頭翻到尾要快对途。索引的原理與之類似赦邻。
索引的作用
1.索引可以提高數(shù)據庫查詢和應用程序的性能;
2.索引可以減少為返回查詢結果集而必須讀取的數(shù)據量实檀;
3.索引還可以強制表中的行具有唯一性惶洲,從而確保表數(shù)據的數(shù)據完整性
索引的組成
索引包含從表或視圖中一個或多個列生成的鍵,以及映射到指定數(shù)據的存儲位置的指針膳犹。
分為兩類:
聚集索引和非聚集索引恬吕。
索引的物理結構--B樹
今天我來討論的是我們的查詢語句,什么時候會走索引须床。用到的數(shù)據庫有PostgreSQL和MySQL铐料。都是主流的開源數(shù)據庫。目前Pg大有超越MySQL的趨勢豺旬。
在我的實驗中钠惩,開發(fā)環(huán)境是 Java8+eclipse+PostgreSQL/MySQL+Windows7.
我們來新建一個表,并測試索引的作用族阅。
在還沒有建立索引的時候篓跛,我們來做一個查詢:
未建索引,檢索到40835條數(shù)據坦刀,花時間3.2秒
對表中的age字段建立索引后愧沟,查詢得:
比對—真實情況
發(fā)現(xiàn),其實當你建立索引后查詢鲤遥,該語句并未走索引沐寺,也就是說你的索引沒用生效。在postgresql數(shù)據庫中盖奈,你建立了單個索引混坞,如果用between,是用不到索引的卜朗。不能單憑一兩次的模擬效果拔第,看到查詢速度快了就以為是索引的作用。
那么场钉,為什么我們看到第二次確實比第一次時間少了很多呢蚊俺?原因我想應該是PostgreSQL對其作了優(yōu)化。因為兩次的SQL是一模一樣逛万,兩次查詢時間間隔很短泳猬。當?shù)谝淮挝唇⑺饕樵兒笈疲胁糠謹?shù)據被緩存在內存中,當你第二次建立了索引查詢得封,發(fā)現(xiàn)時間雖然短了埋心,但確不是因為索引,而是因為部分數(shù)據駐留在內存忙上,這樣查詢出來肯定比第一次查詢完全IO要快拷呆。這個操作系統(tǒng)的cache命中率是一個道理。
再來看一個例子
未建立索引疫粥,查詢語句如下:
只建立了一個id索引的茬斧。
建立了一個age索引,走了age的索引梗逮。
建立了一個age+id索引项秉,只走了age的索引。
總結
對于這樣的查詢語句:
Select *from tb_company where age=$age order by id desc limit 10000慷彤;
對age建索引=對age和id建索引娄蔼,即A+B=A
但是A+B不能替代B(來自于網絡)
有沒有走索引,也不能憑一兩次的數(shù)據觀察所得底哗,而是要通過專門的分析工具分析岁诉。
對于存在like關鍵字的情況探討
(1)當%放在后面的時候
(2)前后都用%匹配‘
(3)只在前面%匹配
看實際的性能分析
對于只在后面加%的查詢,PostgreSQL數(shù)據庫是走了索引的艘虎。
對于前后都加了%唉侄,PostgreSQL數(shù)據庫也是走了索引咒吐。
結論
對于PostgreSQL數(shù)據庫野建,其對各個查詢語句,只要建立了索引恬叹,都走了索引候生,那我們接下來看看MySQL的情況。
MySQL的情況
address索引绽昼,前面加%唯鸭,全表掃描
先來簡要說一下這里的各個字段代表的意思:
select_type代表該SQL是一條簡單的SQL,沒有join硅确,也沒有union目溉。
table代表你查詢的是哪個表。
type為all表示作了全表掃描菱农。
rows代表影響的行數(shù)缭付。
possible_keys** 提示使用哪個索引會在該表中找到行,不太重要
keys MYSQL使用的索引循未,簡單且重要
key_len MYSQL使用的索引長度
ref ref列顯示使用哪個列或常數(shù)與key一起從表中選擇行陷猫。
address索引,后面加%,走了索引.
address索引绣檬,前后加%足陨,全表掃描。
對于like是否走索引的總結
對于like關鍵字娇未,通過以上實驗和搜集的資料墨缘,得出如下結論:
這就是postgresql和mysql的區(qū)別,mysql有如下情況:
1 where address like ‘新疆維吾爾%’ 走了索引
2 where address like ‘%疆維吾爾%’ 并沒有走索引
3.where address like '%疆維吾爾自治區(qū)'零抬,沒有走索引
但是postgresql對此做了優(yōu)化飒房,以上兩種情況都走了索引。
今天講的索引媚值,可能是很簡單的內容狠毯,對于高手來說,這應該是很基礎很基礎的東西褥芒。索引的內容博大精深嚼松,希望與大家一起探討,共同進步C谭觥O仔铩!