1. 程式人生 > >mysql簡單效能調優(一)

mysql簡單效能調優(一)

以前都是做小專案,資料庫表的資料一般都不超過十萬條。最近接手一考試專案,個別表的資料已經超過四百萬的資料量。資料庫一直沒有優化過,所幸表字段不多,並沒有照成很大的隱患。藉此機會學習一下mysql的效能調優。

  1. mysql讀取sql語句順序
    一條sql語句經過機器解析,會分成若干個讀取步驟。機器根據步驟來進行全表掃描匹配查詢出我們想要的結果。mysql的順序步驟為:
    FROM>ON–JOIN>WHERE GROUP BY> HAVING>SELECT>DISTINCT>ORDER BY>LIMIT
    下面上圖更加清晰(圖片來源於某機構)
    sql解析

    我們可以通過上圖清晰的看出mysql載入表中資料到記憶體的步驟。
  2. 索引
    mysql調優最重要的一個東西就是索引。索引其實是一種資料結構,類似與我們書本的目錄。通過目錄快速的進行定位查詢我們想看的章節。索引也是一樣,通過構建索引我們可以快速的進行資料實體地址定位。從而讀取資料,減少系統io的時間。mysql預設使用的資料庫引擎是innoDB。innoDB使用的預設索引資料結構是B-Tree結構。和二叉樹資料結構相識。
    B-tree資料結構
    既然是一種資料結構,那其畢然會佔用一部分儲存空間。而這種類樹的資料結構。我們可以想到。如果資料順序發生改變,例如資料的更改和刪除,會導致樹結構的錯亂,所以mysql這時會進行結構樹的重構。如果資料庫資料非常龐大會佔用很長時間所以如果欄位需要經常進行修改和刪除。那不適合建立索引。一般現在常規的做法資料庫的資料也不會進行物理刪除。均做邏輯刪除。一是可以保證索引樹的健壯。二同樣也可以保證資料的完整性。方便資料的查詢。
    索引的建立方式:
    1.create [unique] index 索引名稱 on 表名(欄位名(length));
    2.alter 表名add [unique] index [索引名稱] on (欄位名(length));
    如果建立多個欄位的複合索引。則在欄位名後面加“,”號繼續新增欄位
    刪除索引
    drop index [索引名稱] on 表名
    檢視索引
    show index from 表名\G
    現在一般可以用檢視工具進行建立。
    索引的型別:
索引型別 欄位名 例子 備註
普通索引 NORMAL CREATE INDEX index_name ON table (column(length)) 是最基本的索引,它沒有任何限制(可不寫)
唯一索引 unique CREATE UNIQUE INDEX indexName ON table (column(length)) 索引列的值必須唯一,但是可以為null
主鍵索引 建表的主鍵,是一種特殊的唯一索引。建表的時候新增主鍵自動生成
組合索引 ALTER TABLE table ADD INDEX name_city_age (name,city,age) 多個欄位組成的複合索引。主要用於條件查詢
全文索引 fulltext CREATE FULLTEXT INDEX index_content ON article(content) 主要用來查詢文字中的關鍵字,而不是直接與索引中的值相比較。
*這裡需要注意的是全文索引(fulltext):fulltext索引跟其它索引大不相同,它更像是一個搜尋引擎,而不是
簡單的where語句的引數匹配。fulltext索引配合match against操作使用,而不是一般的where語句加like。它可
以在create table,alter table ,create index使用,不過目前只有char、varchar,text 列上可以建立全文索引
。值得一提的是,在資料量較大時候,現將資料放入一個沒有全域性索引的表中,然後再用CREATE index建立
fulltext索引,要比先為一張表建立fulltext然後再將資料寫入的速度快很多。

*一般情況下一張表建立的索引最好不要超過5個。