高性能索引優(yōu)化策略(一):隔離數(shù)據(jù)列和前綴索引

正確地創(chuàng)建和使用索引對于查詢性能十分重要磺陡。由于存在很多種特殊場景的優(yōu)化和行為减途,因此有很多種方式去有效選擇和使用索引捎废。因此种玛,決定如何使用索引這一項技能是需要經(jīng)驗和時間的積累去培養(yǎng)的藐鹤。以下會介紹一些如何有效使用索引的方法。

隔離數(shù)據(jù)列

通常赂韵,我們會發(fā)現(xiàn)查詢語句會妨礙MySQL使用索引娱节。除非在查詢語句中列是獨立的,否則MySQL不會使用這些列的索引右锨±ǖ蹋“隔離”的意思是索引列不應該成為表達式的一部分或者在一個查詢函數(shù)體中。例如下面的例子就不會命中actor_id這個索引绍移。

SELECT `actor_id` FROM `actor` WHERE `actor_id` + 1 = 2;

對于人來說悄窃,很容易知道查詢條件實際是actor_id = 4,但是MySQL不會這么處理蹂窖,因此養(yǎng)成簡化WHERE判決條件的習慣轧抗,這意味著索引列獨立地在比較操作符的一側(cè)。下面是另外一個普遍錯誤的案例:

SELECT ... WHERE TO_DAYS(CURRENT_DATE) - TO_DAYS(date_col) <= 10;

前綴索引和索引的選擇性

有時候需要在很長字符的列上建立索引瞬测,但這樣會導致索引占據(jù)的空間很大且查詢變慢横媚。一個策略是使用哈希索引模擬,但有時候這未必是足夠好月趟,這個時候該怎么做灯蝴?

通常是可以將索引列前面的部分字符建立索引來替換全字段索引提高性能和節(jié)省空間。但這種方式會使得選擇性變差孝宗。索引的選擇性是指獨立的索引值篩選出的數(shù)據(jù)占整個數(shù)據(jù)集合的比例穷躁。高選擇性的索引可以讓MySQL過濾掉更多無關的數(shù)據(jù)。例如因妇,一個唯一索引的選擇性是1问潭。
列的前綴通常在選擇性方面已經(jīng)能夠提供足夠好的性能。如果使用BLOB或TEXT或非常長的VARCHAR字段列婚被,你必須定義前綴索引狡忙,以為MySQL不允許做全長度索引。

你需要在使用更長的前綴以獲得更好的選擇性和足夠短的前綴以節(jié)省存儲空間之間平衡址芯。為了確定一個合適的前綴長度灾茁,查找出最高頻的值,然后和最頻繁的前綴進行比較谷炸。例如以城市數(shù)據(jù)表為例删顶,我們可以使用如下的語句統(tǒng)計:

SELECT COUNT(*) as cnt, `name` FROM `common_city` GROUP BY `name` ORDER BY cnt DESC LIMIT 10
字段頻率統(tǒng)計

可以看到這些城市名稱出現(xiàn)的次數(shù)比較多。現(xiàn)在我們可以使用1個字的前綴查找最為頻繁的城市名稱前綴淑廊。

SELECT COUNT(*) as cnt, LEFT(`name`, 1) as pref FROM `common_city` GROUP BY pref ORDER BY cnt DESC LIMIT 10
前1個字出現(xiàn)的頻率

可以看到1個字找出來的數(shù)據(jù)集更多了逗余,這會導致獨立選中的機會越少,因此需要調(diào)整一下前綴的長度季惩。例如調(diào)到3個字录粱。

SELECT COUNT(*) as cnt, LEFT(`name`, 3) as pref FROM `common_city` GROUP BY pref ORDER BY cnt DESC LIMIT 10
前3個字出現(xiàn)的頻率

可以看到這和全長度的相差不多,那實際三個字的前綴就夠了(原文使用的是英文城市數(shù)據(jù)表画拾,字符會更多)啥繁。另外一種方式是使用不同長度的前綴數(shù)量與全字段數(shù)量的比例評估多少合適。例如:

SELECT 
  COUNT(DISTINCT LEFT(`name`, 1)) / COUNT(`name`) as pref1, 
  COUNT(DISTINCT LEFT(`name`, 2)) / COUNT(`name`) as pref2, 
  COUNT(DISTINCT LEFT(`name`, 3)) / COUNT(`name`) as pref3, 
  COUNT(DISTINCT LEFT(`name`, 4)) / COUNT(`name`) as pref4 
FROM `common_city`
分別統(tǒng)計頻率

數(shù)值越接近于1效果越好青抛,但是也可以看到旗闽,隨著前綴長度的加長改善的空間越小。只看平均值并不是一個好主意,還需要檢查一下最壞情況适室。也許會覺得3-4個字足夠了嫡意,但是如果數(shù)據(jù)分布很不均勻,那可能會存在陷阱捣辆。因此還需要檢查一下前綴少的是不是存在一個前綴對應的數(shù)據(jù)與其他相比極其多的情況蔬螟。最后可以給指定的列加前綴索引。

ALTER TABLE `common_city` ADD KEY (name(3));

前綴索引在節(jié)省空間和提高效率方面表現(xiàn)不錯汽畴,但是也有缺陷旧巾,那就是在ORDER BY和GROUP BY上無法使用索引(實際驗證在MySQL 5.7以上版本也有用)。另外一種常見的場景是在較長的十六進制字符串中忍些,例如存儲的sessionId鲁猩,取前8位前綴做索引將過濾很多無關數(shù)據(jù),效果很好罢坝。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末廓握,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子炸客,更是在濱河造成了極大的恐慌疾棵,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件痹仙,死亡現(xiàn)場離奇詭異是尔,居然都是意外死亡,警方通過查閱死者的電腦和手機开仰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門拟枚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人众弓,你說我怎么就攤上這事恩溅。” “怎么了谓娃?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵脚乡,是天一觀的道長。 經(jīng)常有香客問我滨达,道長奶稠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任捡遍,我火速辦了婚禮锌订,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘画株。我一直安慰自己辆飘,他們只是感情好啦辐,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蜈项,像睡著了一般芹关。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上战得,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天充边,我揣著相機與錄音庸推,去河邊找鬼常侦。 笑死,一個胖子當著我的面吹牛贬媒,可吹牛的內(nèi)容都是我干的聋亡。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼际乘,長吁一口氣:“原來是場噩夢啊……” “哼坡倔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起脖含,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤罪塔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后养葵,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體征堪,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年关拒,在試婚紗的時候發(fā)現(xiàn)自己被綠了佃蚜。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡着绊,死狀恐怖谐算,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情归露,我是刑警寧澤洲脂,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站剧包,受9級特大地震影響恐锦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜玄捕,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一踩蔚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧枚粘,春花似錦馅闽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽局骤。三九已至,卻和暖如春暴凑,著一層夾襖步出監(jiān)牢的瞬間峦甩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工现喳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留凯傲,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓嗦篱,卻偏偏與公主長得像冰单,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子灸促,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容