關於MySql的索引原理以及優化原則

2021-09-24 07:39:33 字數 2110 閱讀 3996

在面試或者實際的工作中,我們都會遇到會需要優化mysql的場景,那麼優化mysql的原理到底是什麼呢。

根據當前的我們可以根據他的執行過程來進行對應的優化操作。

1.避免使用select *或者盡量使用limit 1這種限量級的語句

原因:從上圖我們可以看到,mysql是的通訊協議是「半雙工」的,意思就是如果伺服器向mysql發出請求之後,mysql必須接收到伺服器的所有請求引數以後,才可以對資料進行處理操作,然後再返回給伺服器端,也就是說我們不能在邊請求的過程中邊獲得資料。所以當我們查詢語句很長的時候,需要設定max_allowed_packet引數,但是如果查詢語句真的特別長,伺服器端可能會因為無法接受過多資料而導致丟擲異常。當我們對mysql發起請求的時候,mysql必須返回我們查詢的所有結果,不能只返回前幾條結果。因而在實際開發中,盡量保持查詢簡單且只返回必需的資料,減小通訊間資料報的大小和數量是乙個非常好的習慣,這也是查詢中盡量避免使用 select * 以及加上 limit 限制的原因之一

2.查詢的快取設定

原因:從上面的圖中可以看到,所有打進mysql的查詢第一步都是會從快取中查詢資料,如果快取命中會直接從快取中獲取資料的。但是並不是一味的設定快取就能提高我們的查詢效率的。既然是快取,那肯定會有失效的,快取和失效時都會帶來效能上的額外消耗,並且快取命中的要求比較嚴格,比如第一次查詢和第二次查詢時,字段順序發生改變會導致快取無法命中;使用mysql的一些函式特性,比如now(),current_date()等一些函式也會導致快取無法命中。所以當我們的業務場景下快取帶來的收益效果大於其效能消耗時,可以考慮引入快取的配置。

3.資料型別優化

原因:選擇資料型別只要遵循小而簡單的原則就好,越小的資料型別通常會更快,占用更少的磁碟、記憶體,處理時需要的cpu週期也更少。越簡單的資料型別在計算時需要更少的cpu週期,比如,整型就比字元操作代價低,因而會使用整型來儲存ip位址,使用 datetime來儲存時間,而不是使用字串

4.一些優化sql的操作

比如優化聯表查詢,在大資料場景下,表與表之間通過乙個冗餘欄位來關聯,要比直接使用 join有更好的效能。還有比如用union all去代替union,除非我們需要用到去重。如果沒有 all關鍵字,mysql會給臨時表加上 distinct選項,這會導致整個臨時表的資料做唯一性檢查,這樣做的代價非常高

5.儲存引擎的選擇

5.索引

索引我放到最後乙個說是有原因的,因為索引涉及的東西太多了。

首先需要考慮乙個問題:我們需要在哪個列上加索引,如果單列查詢,那索引肯定是加在對應的列上,如果多列索引呢,因為索引是遵循「最左原則」的,索引的字段在最左邊才會效率最高。比如我們有 select * from user where name = "urey" and age = "25",我們可以通過執行下面的語句,看哪一列的語句最接近於1那麼就可以將此列放至最左邊並加入索引

select count(distinct name)/count() as name_selectivity, count(distinct age)/count() as age_selectivity,count(*) from user

關於索引的最左原則:select * from user where name = "urey" and age = "25"  還是這句語句,mysql在查詢的時候會先查詢 name = 「urey」 的所有資料,而後在前者的結果中再查詢age = 25的資料,因此如果age 上加入索引的話,效率會很低下。

關於索引還有乙個就是我們常說的為什麼索引常用的是b+樹呢,他的查詢效率肯定是低於hash的,為什麼不用hash呢。

原理:因為b+樹是多路搜尋樹,在查詢單條資料的時候,雜湊查詢的時間複雜度為o(1),確實比b+樹會快很多,但是b+樹的優勢在於他的所有資料都儲存在子節點之上,並且子節點之間是按照鍊錶順序相連的,比如我們需要查詢20-30的資料的時候,b+樹會先從多路中查詢20的子節點位置,而到30相當於就是limit10,此時b+樹會遍歷鍊錶向後查詢10個數字,不需要再去從跟節點進行查詢,所以在查詢多資料情況下時,b+樹的威力就體現出來了。

mysql方面自己也沒有太多的了解深入,文中可能會涉及許多問題,所以有不對的地方歡迎指出一起討論。

csdn:blog.csdn.net/lmx125254

ureyblog.cn/web/#/       乙個模仿掘金頁面的**,負責展現掘金的後台專題的相關技術文章

關於Mysql索引的優化以及原理學習

1.最左字首匹配原則,非常重要的原則,mysql會一直向右匹配直到遇到範圍查詢 between like 就停止匹配,比如a 1 and b 2 and c 3 and d 4 如果建立 a,b,c,d 順序的索引,d是用不到索引的,如果建立 a,b,d,c 的索引則都可以用到,a,b,d的順序可以...

Mysql的join連線查詢的原理以及優化

1.nested loop join 如下圖,r為驅動表,s為匹配表,可以看到從r中分別取出r1 r2 rn去匹配s表的左右列,然後再合併資料,對s表進行了rn次訪問,對資料庫開銷大 2.index nested loop join 索引巢狀 這個要求非驅動表 匹配表s 上有索引,可以通過索引來減少...

關於mysql索引 關於mysql的索引

我們先來了解mysql索引的概念 索引是一種特殊的檔案,他們包含著對資料表裡所有記錄的引用指標。更通俗地說,資料庫索引好比是是一本書前面的目錄,能加快資料庫的查詢速度,我們有了相應的索引後,資料庫會直接在索引中查詢符合條件的選項。索引分為聚簇索引和非聚簇索引兩種,聚簇索引是按照資料存放的物理位置為順...