mysql索引s mysql索引優化

2021-10-18 06:00:24 字數 1489 閱讀 1986

這裡記錄一些看了《高效能mysql》後的一些學習心得

在弄清楚mysql innodb前要提前了解索引的原理,最基本的要了解磁碟結構與工作方式還有b-tree結構。

加索引的目的:

減少伺服器執行sql時掃瞄的資料量

避免order by或者group by等操作的時候產生的臨時表

將隨機io變成順序io

評價索引好壞的標準:

一星,索引將相關的資料放在一起

二星,索引中列的順序與查詢中的列的順序是一樣的

三星,索引中的列包含查詢中的所有列

設計索引注意事項:

多個欄位的聯合索引要與查詢的順序一致,那麼這裡就涉及乙個問題,在設計查詢的時候應該把哪一列做為第乙個被查詢的字段呢?

e.g.使用如下原則:

這樣做的原因:盡量通過btree去找到資料,而不是讓第二級變得很大而去遍歷,降低演算法複雜度

另外一點是通常把查詢範圍的字段放到索引最後,比如婚戀**的年齡選項,因為年齡通常是乙個範圍搜尋條件,如果把該字段放到多列索引的中間位置,那麼後邊的索引就都用不上了。

2. 覆蓋索引:使用覆蓋所引可以減少回表的次數,因為innodb裡邊頁子結點儲存的是主鍵值,如果直接把字段值儲存到裡邊那麼就不用先找到主鍵再去通過主鍵去找值了。

3. 延持關聯:  通常如下mysql需要通過延遲關聯來進行優化,(1)表中資料量大(2)先order by再limit m, n。因為符合這親條件的sql要先查詢n+m行,然後進行排序再查詢,效率很低,浪費大量cpu與記憶體資源

select id, cu_id, name, info, biz_type, gmt_create, gmt_modified,start_time, end_time, market_type, back_leaf_category,item_status,picuture_url from relation where biz_type ='0'

and end_time >='2014-05-29' order by id asc limit 149420 ,20;

優化原理是內層sql先通過覆蓋索引找到相應的主鍵,而不是所有的資料行,這樣就大大減少了需要讀到記憶體中的行數,提高了效率。

select a.* from relation a, (select id from relation where biz_type ='0' and end_time >='2014-05-29' order by id asc limit 149420 ,20 ) b where a.id=b.id

4. 重複索引:  應該盡量不用冗餘的索引。比如(a,b)這個索引會包含索引a,但是不包含(b,a)與b。但是有的時候為了效能也要同時保留(a,b)與a,因為(a,b)會比a的效率低,當 (a,b)做為a使用的時候

mysql 索引 手冊 MySQL 索引

mysql 索引 mysql索引的建立對於mysql的高效執行是很重要的,索引可以大大提高mysql的檢索速度。打個比方,如果合理的設計且使用索引的mysql是一輛蘭博基尼的話,那麼沒有設計和使用索引的mysql就是乙個人力三輪車。索引分單列索引和組合索引。單列索引,即乙個索引只包含單個列,乙個表可...

mysql非同步索引 MySQL索引

一 為什麼要使用索引 優化查詢,減少掃瞄的錶行數。打個比方,索引的作用就和查新華字典,字典的索引的作用的一樣的。二 索引的型別 1 索引是在儲存引擎中實現的,而不是在伺服器層中實現的。所以,每種儲存引擎的索引都不一定完全相同,並不是所有的儲存引擎都支援所有的索引型別。2 如果使用的是組合索引 即有多...

mysql 索引 鍵名 mysql 索引

3 索引型別 在建立索引時,可以規定索引能否包含重複值。如果不包含,則索引應該建立為primary key或unique索引。對於單列惟一性索引,這保證單列不包含重複的值。對於多列惟一性索引,保證多個值的組合不重複。primary key索引和unique索引非常類似。事實上,primary key...