如何通過(guò)優(yōu)化sql語(yǔ)句提高數(shù)據(jù)庫(kù)查詢效率?
網(wǎng)友解答: 謝邀!通過(guò)SQL調(diào)優(yōu)提高查詢性能最重要的就是對(duì)索引的使用,下面是對(duì)索引使用的一些總結(jié),希望對(duì)你有所幫助。MySQL索引對(duì)數(shù)據(jù)檢索的性能至關(guān)重要,盲目的增加索引不僅不能帶來(lái)性能
謝邀!
通過(guò)SQL調(diào)優(yōu)提高查詢性能最重要的就是對(duì)索引的使用,下面是對(duì)索引使用的一些總結(jié),希望對(duì)你有所幫助。
MySQL索引對(duì)數(shù)據(jù)檢索的性能至關(guān)重要,盲目的增加索引不僅不能帶來(lái)性能的提升,反而會(huì)消耗更多的額外資源。
索引是用于快速查找記錄的一種數(shù)據(jù)結(jié)構(gòu)。索引就像是數(shù)據(jù)庫(kù)中數(shù)據(jù)的目錄,數(shù)據(jù)庫(kù)在查詢時(shí),首先在索引中找到匹配的值,然后根據(jù)這個(gè)匹配值找到對(duì)應(yīng)的數(shù)據(jù)行。
聚簇索引的順序就是數(shù)據(jù)的物理存儲(chǔ)順序,索引中數(shù)據(jù)域存儲(chǔ)的就是實(shí)際的數(shù)據(jù),一個(gè)表最多只能有一個(gè)聚簇索引,適用于查詢多行數(shù)據(jù),不適用于頻繁修改的列,一般在主鍵上創(chuàng)建。
非聚簇索引順序與數(shù)據(jù)物理排列順序無(wú)關(guān),索引中存儲(chǔ)的內(nèi)容為實(shí)際數(shù)據(jù)的地址,適應(yīng)于查詢單行數(shù)據(jù)。
普通索引,即平時(shí)創(chuàng)建的普通索引。
唯一索引,索引所在的列或列組合的值是全表唯一的。
全文索引,MySQL從3.23.23版開(kāi)始支持全文索引,它查找的是文中的關(guān)鍵詞,而不是直接比較索引中的值。
單列索引,在單列上創(chuàng)建的索引。
組合索引,在多個(gè)列上創(chuàng)建的索引。
最左前綴查找:where子句中有a、b、c三個(gè)查詢條件,創(chuàng)建一個(gè)組合索引abc(a,b,c),最左前綴的概念是說(shuō)以組合索引最左邊的列a組合成的查詢條件,如(a,b,c)、(a,b)、(a,c),這三種情況的查詢條件都會(huì)使用abc索引,和where子句中a、b、c出現(xiàn)的順序沒(méi)關(guān)系,可以是where c=? and b=? and a=?,但(b,c)組合不會(huì)使用索引,即where c=? and b=?。
哪些列適合創(chuàng)建索引:
1.經(jīng)常作為查詢條件的列;
2.經(jīng)常作為排序條件的列;
3.經(jīng)常作為join條件的列;
4.經(jīng)常被查詢的列。
哪些列不適合創(chuàng)建索引:
1.數(shù)據(jù)頻繁被修改的列,數(shù)據(jù)被修改,索引需要做相應(yīng)的修改,消耗資源; 2.區(qū)分度不是很高的列,如性別,列值重復(fù)性太大,索引效果不是很明顯; 3.不是經(jīng)常被作為查詢條件、排序條件、連接條件的列。
經(jīng)驗(yàn)總結(jié):
1.列上進(jìn)行函數(shù)計(jì)算將不會(huì)使用索引;
2.對(duì)于創(chuàng)建索引的列,避免存儲(chǔ)NULL,NULL會(huì)使索引更加復(fù)雜、效率變低,可以使用NOT NULL進(jìn)行約束;
3.對(duì)于模糊查詢like '%abc%',將不會(huì)使用索引,而like 'abc%'將會(huì)使用索引;
4.對(duì)于not in、not exists、!=等負(fù)向查詢將不會(huì)使用索引;
5.每次查詢只使用一個(gè)索引,如果where條件使用了索引,order by將不再使用索引;
6.對(duì)于where子句中有多個(gè)查詢條件的,單列索引的效率不如復(fù)合索引,因?yàn)椴樵兠看沃荒苁褂靡粋€(gè)索引;
7.MySQL只對(duì)以下操作符才使用索引:<、<=、=、、=、between、in,但是需要注意in的范圍值不要太多;
8.union all可以使用索引,但本身效率不是很高,不建議使用;
9.列上進(jìn)行類型轉(zhuǎn)換的將不會(huì)使用索引;
10.老版本MySQL對(duì)OR條件不使用索引,新版本才支持,不建議使用OR。
關(guān)于索引的實(shí)戰(zhàn)經(jīng)驗(yàn)總結(jié)后續(xù)還會(huì)不斷更新,可以關(guān)注我的酷米號(hào)!
網(wǎng)友解答:通過(guò)優(yōu)化SQL語(yǔ)句,提高數(shù)據(jù)庫(kù)查詢效率,我總結(jié)了有這么幾個(gè)方面:
減少數(shù)據(jù)訪問(wèn)看起來(lái)像一句廢話,少訪問(wèn)數(shù)據(jù)當(dāng)然可以提高速度了,減少數(shù)據(jù)訪問(wèn)有這么幾個(gè)方法:
創(chuàng)建并正確使用索引
我們經(jīng)常用到的就是B-TREE索引,我們經(jīng)常說(shuō)到的【索引】也指的是【B-TREE索引】。
正確使用索引可以讓查詢效率翻倍,但是如果使用不正確,也會(huì)對(duì)效率降低很多,比如這幾種情況就會(huì)造成索引失效:
不等于操作:<? 、not in('')
進(jìn)行了運(yùn)算后的字段:column+1(簡(jiǎn)單的運(yùn)算),function(column)(函數(shù))
含前導(dǎo)模糊查詢:like '%xxx'
IS NULL
隱式類型轉(zhuǎn)換:column是char類型,但是寫成column = 123(右邊是另外一種類型)
只通過(guò)索引訪問(wèn)數(shù)據(jù)有些時(shí)候,我們只需要訪問(wèn)表中的某幾個(gè)列的數(shù)據(jù),我們可以為這幾個(gè)字段建立一個(gè)組合索引,這樣的話只通過(guò)索引就可以得到數(shù)據(jù),可以較小IO的開(kāi)銷。比如:
select name,gender from users where age='25';
如果這個(gè)SQL用的頻率很高,那么我們可以建立一個(gè)組合索引:
create index index_xxx on users(name,gender,age);
在執(zhí)行這個(gè)sql的時(shí)候,數(shù)據(jù)全部都是通過(guò)索引找到的,都不需要訪問(wèn)users表。
優(yōu)化SQL執(zhí)行計(jì)劃執(zhí)行計(jì)劃表示SQL在執(zhí)行時(shí)候的算法,有的時(shí)候SQL語(yǔ)句很復(fù)雜,就需要優(yōu)化SQL的執(zhí)行計(jì)劃去提高SQL的執(zhí)行效率。
其他可能不和SQL有直接的關(guān)系,但確實(shí)效率提升很明顯,比如:
數(shù)據(jù)分頁(yè)處理只返回需要的字段減少交互次數(shù)(batch DML)使用綁定變量(可以減少數(shù)據(jù)庫(kù)服務(wù)器CPU運(yùn)算)