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

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