天天看點

資料庫專題(優化查詢)

一,優化查詢的方法都有哪些?

1.使用索引:

應盡量避免全表掃描,首先應考慮在 where 及 order by ,group by 涉及的列上建立索引。

2.優化sql語句:

  • 2.1 通過 explain(查詢優化神器)用來檢視 SQL 語句的執行效果, 可以幫助選擇更好的索引和優化查詢語句,寫出更好的優化語句。
  • 2.2 任何地方都不要使用 select * from t ,用具體的字段清單代 替“*”,不要傳回用不到的任何字段。
  • 2.3 不在索引列做運算或者使用函數。
  • 2.4 查詢盡可能使用 limit 減少傳回的行數,減少資料傳輸時間和 帶寬浪費。

3優化資料庫對象:

  • 3.1 優化表的資料類型

    使用 procedure analyse()函數對表進行分析,該函數可以對表 中列的資料類型提出優化建議。能小就用小。表資料類型第一個原則是:使用能正确的表示和存儲資料的最短類型。這樣可以減少對磁盤空間、記憶體、cpu 緩存的使用。使用方法:select * from 表名 procedure analyse();

  • 3.2 對表進行拆分

    1.垂直拆分 :把主鍵和一些列放在一個表中,然後把主鍵和另外的列放在另 一個表中。如果一個表中某些列常用,而另外一些不常用,則可以 采用垂直拆分。

    2.水準拆分: 根據一列或者多列資料的值把資料行放到二個獨立的表中。

  • 3.3 使用中間表來提高查詢速度

    建立中間表,表結構和源表結構完全相同,轉移要統計的資料 到中間表,然後在中間表上進行統計,得出想要的結果。

4.硬體優化

  • 4.1 CPU 的優化:選擇多核和主頻高的 CPU。
  • 4.2 記憶體的優化:使用更大的記憶體。将盡量多的記憶體配置設定給 MYSQL 做緩存。
  • 4.3 磁盤 I/O 的優化
    • 4.3.1 使用磁盤陣列
    • 4.3.2 調整磁盤排程算法

5.MySQL 自身的優化

對 MySQL 自身的優化主要是對其配置檔案 my.cnf 中的各項參數 進行優化調整。如指定 MySQL 查詢緩沖區的大小,指定 MySQL 允 許的最大連接配接程序數等。

6.應用優化

  • 6.1 使用資料庫連接配接池
  • 6.2 使用查詢緩存

    它的作用是存儲 select 查詢的文本及其相應結果。如果随後收到 一個相同的查詢,伺服器會從查詢緩存中直接得到查詢結果。查詢 緩存适用的對象是更新不頻繁的表,當表中資料更改後,查詢緩存 中的相關條目就會被清空。

二,當有一個特别大的通路量到資料庫上,如何優化?

1.使用優化查詢的方法

2.主從複制,讀寫分離,負載均衡

目前,大部分的主流關系型資料庫都提供了主從複制的功能,通過配置兩台(或多台) 資料庫的主從關系,可以将一台資料庫伺服器的資料更新同步到另一台伺服器上。網站可 以利用資料庫的這一功能,實作資料庫的讀寫分離,進而改善資料庫的負載壓力。

利用資料庫的讀寫分離,Web 伺服器在寫資料的時候,通路主資料庫(Master),主 資料庫通過主從複制機制将資料更新同步到從資料庫(Slave),這樣當 Web 伺服器讀資料的時候,就可以通過從資料庫獲得資料。

資料庫專題(優化查詢)

主從複制的原理:

(1)master 将資料改變記錄到二進制日志(binary log)中,也即是配置檔案 log-bin 指定 的檔案(這些記錄叫做二進制日志事件,binary log events)

PS:從圖中可以看出,Slave 伺服器中有一個I/O線程(I/O Thread)在不停地監聽 Master 的二進制日志(Binary Log)是否有更新:如果沒有它會睡眠等待 Master 産生新的日志事件; 如果有新的日志事件(Log Events),則會将其拷貝至 Slave 伺服器中的中繼日志(Relay Log)。

(2).slave 将 master 的二進制日志事件(binary log events)拷貝到它的中繼日志(relay log)。

(3).slave 重做中繼日志中的事件,将 Master 上的改變反映到它自己的資料庫中。,所 以兩端的資料是完全一樣的。

PS:從圖中可以看出,Slave 伺服器中有一個 SQL 線程(SQL Thread)從中繼日志讀 取事件,并重做其中的事件,進而更新 Slave 的資料,使其與 Master 中的資料一緻。隻要 該線程與 I/O 線程保持一緻,中繼日志通常會位于 OS 的緩存中,是以中繼日志的開銷很小。

資料庫專題(優化查詢)

主從複制的幾種方式:

  • 1.同步複制:

    主伺服器在将更新的資料寫入它的二進制日志(Binlog)檔案中後,必須等待驗證所 有的從伺服器的更新資料是否已經複制到其中,之後才可以自由處理其它進入的事務處理請求。

  • 2.異步複制

    主伺服器在将更新的資料寫入它的二進制日志(Binlog)檔案中後,無需等待驗證更 新資料是否已經複制到從伺服器中,就可以自由處理其它進入的事務處理請求。

  • 3.半同步複制

    主伺服器在将更新的資料寫入它的二進制日志(Binlog)檔案中後,隻需等待驗證其 中一台從伺服器的更新資料是否已經複制到其中,就可以自由處理其它進入的事務處理請 求,其他的從伺服器不用管。

3.資料庫分表,分區,分庫

分區:就是把一張表的資料分成多個區塊,這些區塊可以在一個磁盤上,也可以在不同 的磁盤上,分區後,表面上還是一張表,但資料散列在多個位置,這樣一來,多塊硬碟同 時處理不同的請求,進而提高磁盤 I/O 讀寫性能,實作比較簡單。 包括水準分區和垂直分 區。

分庫:是根據業務不同把相關的表切分到不同的資料庫中,比如 web、bbs、blog 等庫。