每日一貼,今天的內(nèi)容關(guān)鍵字為組合列
????
為表建立索引,無疑是對(duì)數(shù)據(jù)庫(kù)比較好的優(yōu)化方法之一。以下是自己對(duì)索引的總結(jié)。
????
?
????
MYSQL QUERY Optimizer對(duì)索引的選擇
????
1.即使一個(gè)SQL可以選擇多個(gè)索引,但是大多數(shù)情況下它都市選擇一個(gè)索引,而廢棄其它的索引。
????
應(yīng)用索引的前提:
????
1.索引的存是在where條件之后的。
????
2.在MYSQL中不同的存儲(chǔ)引擎對(duì)索引的看待也是有點(diǎn)不一樣的。
????
?
????
?
????
經(jīng)常使用的索引類型以及情況
????
????
前綴索引(又叫短索引)
????
對(duì)串列停止索引,如果可能應(yīng)該指定一個(gè)前綴長(zhǎng)度。例如,如果有一個(gè)CHAR(255)的 列,如果在前10 個(gè)或20 個(gè)字符內(nèi),多數(shù)值是唯一的,那么就不要對(duì)整個(gè)列停止索引。短索引不僅可以提高查詢速度而且可以節(jié)儉磁盤空間和I/O操作。
????
示例代碼:
//創(chuàng)建短索引
create
???? index
????ix_test
???? on
????t(col(200))
//適用的情況
SELECT
????userName,income
???? FROM
????t
???? WHERE
????col
???? like
????'
???? john%
????';
????
也就是說: 短索引的適用范圍主要是在like之后第一個(gè)非’%’的實(shí)例。
????
?
????
?
????
組合索引
????
????
比如有一條語句是這樣的:select * from users where area=’beijing’ and age=22;
如果我們是在area和age上分別創(chuàng)建單個(gè)索引的話,由于mysql查詢每次只能應(yīng)用一個(gè)索引,所以雖然這樣已經(jīng)相對(duì)不做索引時(shí)全表掃描提高了很多效率,但是如果在area、age兩列上創(chuàng)建復(fù)合索引的話將帶來更高的效率。如果我們創(chuàng)建了(area, age, salary)的復(fù)合索引,那么其實(shí)相當(dāng)于創(chuàng)建了(
area
,age,salary)、(
area
,age)、(
area
)三個(gè)索引,這被稱為最好左前綴特性。
????
對(duì)于組合索引,MYSQL數(shù)據(jù)庫(kù)所停止查詢的道理:
select
????*
???? from
????users
???? where
????area=’beijing’
???? and
????age=22;
select
????*
???? from
????users
???? where
????area=’beijing’;
如果area有索引,則以上的SQL語句都市應(yīng)用索引,因?yàn)榻M合索引有最好左前綴的特性,而select *
???? from
????users
???? where
????age=22; 則不會(huì)應(yīng)用索引。
????
?
????
因此我們?cè)趧?chuàng)建復(fù)合索引時(shí)應(yīng)該將最經(jīng)常使用作限制條件的列放在最左邊,依次遞減。
????
?
????
?
????
單鍵索引還是組合索引
????
????
在一般的應(yīng)用場(chǎng)景中, 只要不是其中某個(gè)過濾字段在大多數(shù)場(chǎng)景下能過濾90%以上的數(shù)據(jù)( 這類可能性很小 ),而其他的過濾字段會(huì)頻繁的更新,一般更傾向于創(chuàng)建組合索引,尤其是在并發(fā)量較高的場(chǎng)景下 。因?yàn)楫?dāng)并發(fā)量較高的時(shí)候,即使只為每一個(gè)Query節(jié)儉了很少的 IO 消費(fèi),但因?yàn)閳?zhí)行量非常大,所節(jié)儉的資源總量仍然是非常可觀的。
????
?
????
當(dāng)然, 創(chuàng)建組合索引并不是說就須要將查詢條件中的所有字段都放在一個(gè)索引中,還應(yīng)該盡量讓一個(gè)索引被多個(gè) Query 語句利用,盡量減少同一個(gè)表上的索引數(shù)量 ,減少因?yàn)閿?shù)據(jù)更新帶來的索引更新本錢,同時(shí)還可以減少因?yàn)樗饕M(fèi)的存儲(chǔ)空間。
????
?
????
有OR在SQL語句中來應(yīng)用索引的情況
????
????
如果有or,where前面就必須全面條件有索引,否則索引將不會(huì)起作用,所以必定要為or的全部字段創(chuàng)建索引
????
SELECT * FROM test WHERE last_name='Widenius' OR first_name='Michael';
????
?
????
?
????
ordery by以及索引排序
????
????
mysql查詢只應(yīng)用一個(gè)索引,因此如果where子句中已經(jīng)應(yīng)用了索引的話,那么order by中的列是不會(huì)應(yīng)用索引的。
????
因此數(shù)據(jù)庫(kù)默認(rèn)排序可以符合要求的情況下不要應(yīng)用排序操作;(排序功能由索引來實(shí)現(xiàn)) 盡量不要包括多個(gè)列的排序,如果需要最好給這些列創(chuàng)建復(fù)合索引。
文章結(jié)束給大家分享下程序員的一些笑話語錄: 程序員的愿望
有一天一個(gè)程序員見到了上帝.上帝: 小伙子,我可以滿足你一個(gè)愿望.程序員: 我希望中國(guó)國(guó)家隊(duì)能再次打進(jìn)世界杯.
上帝: 這個(gè)啊!這個(gè)不好辦啊,你還說下一個(gè)吧!
程序員: 那好!我的下一個(gè)愿望是每天都能休息6個(gè)小時(shí)以上.
上帝: 還是讓中國(guó)國(guó)家打進(jìn)世界杯.
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
