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