小貝_mysql最佳化學習,小貝_mysql最佳化

來源:互聯網
上載者:User

小貝_mysql最佳化學習,小貝_mysql最佳化
mysql最佳化簡要:
1、資料庫設計最佳化
2、sql語句最佳化
3、表分割
4、讀寫分離技術

 

一、資料庫設計最佳化

1、表設計要符合三範式,當然,有時也需要適當的逆範式

2、什麼是三範式

一範式: 具有原子性,不可再分割

二範式: 在滿足一範式的基礎上,我們考慮是否滿足二範式。只要表的記錄滿足唯一性,也是說,同一張表,不可能出現完全相同的記錄,一般說,在表中設計一個主鍵即可。

三範式: 在滿足二範式的基礎上,我們考慮是否滿足三範式。只要表滿足沒冗餘性。

 

二、SQL語句最佳化

1、sql最佳化的一般步驟

a、通過show status命令瞭解各種sql的執行效率

b、定位執行效率較低的sql語句

c、通過explain/desc分析低效率的sql語句的執行情況

d、確定問題並採取相應的最佳化措施

2、showstatus命令

該命令可以顯示mysql資料庫目前狀態,主要關心的是’com’開頭的指令

showstatus like ‘com%’ ó show session status like ‘com%’//顯示當前控制台的情況

showglobal status like ‘com%’ //顯示資料庫從啟動到現在的情況

3、showvariables命令

該命令可以查看mysql當前的變數設定,主要關心的是慢查詢時間

 

4、如何在mysql中找到慢查詢的sql語句

(備忘: mysql資料庫支援把慢查詢語句,記錄到日誌中給程式員分析;預設情況下,mysql不啟用慢查詢日誌)

步驟: a、啟動mysql慢查詢

              a1、在啟動mysql服務時,指定—slow-query-log

              a2、在利用用戶端登進mysql後,設定變數

             

              b、查看慢查詢時間

預設為10秒

             c、修改慢查詢時間

設定為1秒

(這個只能在當前環境生效,如果想每次都生效,就修改mysql的設定檔)

              d、查看慢查詢日誌

              e、根據慢查詢的sql語句,進行最佳化。最廉價的做法就是加索引

              f、加上索引後

 

5、索引的影響

       a、增加磁碟空間

       b、給增刪改帶來不便

6、哪些列上適合添加索引

       a、頻繁地作為查詢條件欄位應該建立索引

       b、唯一性太差的欄位(即該欄位的值變化不大)不適合單獨建立索引,即使頻繁作為查詢條件

       c、更新非常頻繁的欄位不適合建立索引

       d、不會出現在where子句中欄位也不應該建立索引

7、索引的使用

測試表:

Create Table: CREATE TABLE`t2` (

  `id` int(11) NOT NULL DEFAULT '0',

  `name` char(5) DEFAULT NULL,

  `age` tinyint(4) DEFAULT NULL,

  PRIMARY KEY (`id`)

) ENGINE=MyISAM DEFAULTCHARSET=utf8;

insert into t2(name,age) values('a',2),('aa',3),('b',4),('c',3);

查詢要使用索引最重要的條件是查詢條件中需要使用索引。

下列幾種情況下有可能使用到索引:

a、對於建立的多列索引,只要查詢條件使用了最左邊的列,索引一般就會被使用。


b、對於使用like的查詢,查詢如果是  ‘%aaa’不會使用到索引‘aaa%’ 會使用到索引。

下列的表將不使用索引:

a、如果條件中有or,即使其中有條件帶索引也不會使用。


b、對於多列索引,不是使用的第一部分,則不會使用索引。
c、like查詢是以%開頭
d、如果列類型是字串,那一定要在條件中將資料使用引號引用起來。否則不使用索引。
e、如果mysql估計使用全表掃描要比使用索引快,則不使用索引。

8、驗證索引使用方式

showstatus like ‘Handler_read%’;


備忘:
handler_read_key:這個值越高越好,越高表示使用索引查詢到的次數。

handler_read_rnd_next:這個值越高,說明查詢低效。

 

9、常用SQL最佳化

a、大批量插入資料:

       對於MyIsam:

1、alter table table_name disable keys;

       2、loading data;

       3、alter table table_name enable keys;

       對於Innodb:

       1、將要匯入的資料按照主鍵排序

       2、set unique_checks=0,關閉 唯一性校正

       3、set autocommit=0,關閉自動認可

(提示: myisam和innodb的區別是:

a、myisam不支援外接,innodb支援

b、myisam不支援事務,innodb支援)


b、最佳化group by

預設情況下,mysql對group by後面的列名進行排序。如果查詢中包括group by但使用者想要避免排序結果的消耗,可以使用order by null禁止排序

 

三、表分割

當一個表的資料很大的時候,其它的最佳化方式已經都考慮進去。起到的作用不大時,就要考慮分表了。即把一張大表分割成多張小表。

分表方式:

a、垂直分表

       此時,表中存在很多列,這個時候可以通過主鍵,把表中列分成多張表,然後再根據主鍵進行關聯.(拆分後,每張表的列都不同)

       分表前: 個人資訊表

id

name

age

email

intro

1

a

11

11@qq.com

xxxx

2

b

22

22@qq.com

yyyy

 

 

 

 

 

 

       分表後: 個人資訊表

id

name

age

email

1

a

11

11@qq.com

2

b

22

22@qq.com

       個人介紹表

id

intro

1

xxxx

2

yyyy

 

b、水平分表

       可以通過模數的方式,進行分表。因此,需要判斷分成幾張小表,即模的值為多少。另外,拆分後,每張表的列都是一致的。

       分表前: 個人資訊表

id

name

age

email

intro

1

a

11

11@qq.com

xxxx

2

b

22

22@qq.com

yyyy

 

 

 

 

 

       確定模數的值為2,因此可以把這種表分為兩張小表

       1、判斷id的值,id/2=?

       分表後: 個人資訊表0

id

name

age

email

intro

1

a

11

11@qq.com

xxxx

個人資訊表1

id

name

age

email

intro

2

b

22

22@qq.com

yyyy

 

 

四、讀寫分離

通常來說,一台mysql伺服器承載著所有關於資料庫的操作。但是在訪問量大的時候,mysql伺服器很容易出現瓶頸。為了減少mysql伺服器的壓力,(mysql本身支援主從複製功能)

可以通過分離讀寫操作。

1、讀寫分離前

 

2、讀寫分離

 


The quieter you become,the more you are able to hear!

 

 

 

 

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

相關文章

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.