MySQL大資料查詢效能最佳化教程

來源:互聯網
上載者:User
MySQL效能最佳化包括表的最佳化與列類型選擇,表的最佳化可以細分為什嗎? 1、定長與變長分離;2、常用欄位與不常用欄位要分離; 3、在1對多,需要關聯統計的欄位上添加冗餘欄位。

一、表的最佳化與列類型選擇

表的最佳化:

1、定長與變長分離

如 id int,佔4個位元組,char(4)佔4個字元長度,也是定長,time即每一單元值占的位元組是固定的。

核心且常用欄位,宜建成定長,放在一張表。

而varchar,text,blob這種變長欄位,適合單放一張表,用主鍵與核心表關聯起來。

2、常用欄位與不常用欄位要分離

需要結合網站具體的業務來分析,分析欄位的查詢情境,查詢頻率低的欄位,單拆出來。

3、在1對多,需要關聯統計的欄位上添加冗餘欄位。

看如下的效果:

每個版塊裡,有N條文章,在首頁顯示了版塊資訊和版塊下的貼文數。

這是如何做的

如果board表只有前2列,則需要取出版塊後,

再查post表,select count(*) from post group by board_id,得出每個版塊的貼文數。

二、列類型選擇

1、欄位類型優先順序

整型>date

time>enum

char>varchar>blob,text

整型:定長,沒有省/地區之分,沒有字元集的差異。比如:

tinyint 1,2,3,4,5 <--> char(1) a,b,c,d,e

從空間上,都佔1個位元組,但是 order by 排序,前者快。原因,或者需要考慮字元集與校對集(就是定序);

time定長,運算快,節省空間的。考慮時區,寫sql時不方便 where > `2018-08-08`;

enum,能起到約束的目的,內部用整型來儲存,但與cahr聯查時,內部要經曆串與值的轉化;

char定長,考慮字元集和(排序)校對集;

varchar不定長,要考慮字元集的轉換與排序時的校對集,速度慢;

text/blob 無法使用記憶體暫存資料表(排序等操作只能在磁碟上進行)

附:關於date/time的選擇,大師的明確意見,直接選 int unsgined not null,儲存時間戳記。

例如:

性別:以utf8為例

char(1) ,3個字長位元組

enum('男','女'); 內部轉成數字來存,多一個轉換過程

tinyint(), 定長1個位元組

2、夠用就行,不要慷慨(如 smallint varchar(N))

原因:大的位元組浪費記憶體,影響速度。

以年齡為例 tinyint unsigned not null,可以儲存255歲,足夠。用int浪費了3個位元組;

以varchar(10),varchar(300)儲存的內容相同,但在表聯查時varchar(300)要花更多記憶體。

3、盡量避免用NULL()

原因:NULL不利於索引,要用特殊的字元來標註。

在磁碟上佔據的空間其實更大(MySQL5.5已對null做的改進,但查詢仍是不便)

三、索引最佳化策略

1、索引類型

1.1 B-tree索引

名叫btree索引,大的方面看,都用的平衡樹,但具體的實現上,各引擎稍有不同,比如,嚴格的說,NDB引擎,使用的是T-tree.

但抽象一下 B-tree系統,可理解為“排好序的快速查詢結構”。

1.2 hash索引

在memory表裡預設是hash索引,hash的理論查詢時間複雜度為O(1)。

疑問:既然hash的尋找如此高效,為什麼不都用hash索引?

回答:

1、hashFunction Compute後的結果,是隨機的,如果是在磁碟上放置資料,以主鍵為id為例,那麼隨著id的增長,id對應的行,在磁碟上隨機放置。

2、無法對範圍查詢進行最佳化。

3、無法利用首碼索引,比如在btree中,field列的值“helloworld”,並加索引查詢 x=helloworld自然可以利用索引,x=hello也可以利用索引(左首碼索引)。

4、排序也無法最佳化。

5、必須回行,就是說通過索引拿到資料位元置,必須回到表中取資料。

2、btree索引的常見誤區

2.1 在where條件常用的列上加索引,例如:

where cat_id = 3 and price>100;查詢第三個欄目,100元以上的商品。

誤區:cat_id 上和price上都加上索引。

錯:只能用上cat_id 或 price索引,因為是獨立的索引,同時只能用一個。

2.2 在多列上建立索引後(聯合索引),查詢哪個列,索引都會將發揮作用

誤區:多列索引上,索引發揮作用,需要滿足左首碼要求。

以 index(a,b,c) 為例,(注意和順序有關)

四、索引實驗

例如:select * from t4 where c1=3 and c2 = 4 and c4>5 and c3=2;

用到了哪些索引:

explain select * from t4 where c1=3 and c2 = 4 and c4>5 and c3=2 \G

如下:

註:(key_len : 4 )

五、聚簇索引與非聚簇索引

Myisam與innodb引擎,索引檔案的異同

Myisam:由news.myd和new.myi兩個檔案,索引檔案和資料檔案是分開的,叫非聚簇索引。主索引和次索引都指向物理行(磁碟的位置)

innodb:索引和資料是聚在一起的,所以是聚簇索引。innodb的主索引檔案上直接存放該行資料,次索引指向對主鍵索引的引用。

注意:innodb來說:

1、主鍵索引 即存放索引值,又在葉子中儲存行的資料。

2、如果沒有主鍵(primary key),則會unique key做主鍵。

3、如果沒有unique,則系統產生一個內部的rowid做主鍵。

4、像innodb中,主鍵的索引結構中,即儲存了主索引值又儲存了行資料,這種結構稱為聚簇索引。

聚簇索引

優勢:根據主鍵查詢條目比較少時,不用回行(資料就在主鍵節點下)

劣勢:如果碰到不規則資料插入時,造成頻繁的頁分裂

相關文章:

Mysql 效能最佳化

相關視頻:

MySQL最佳化視頻教程

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.