mysql資料庫優先 MySQL資料庫優化

2021-10-18 22:29:46 字數 3589 閱讀 7447

1. 新增索引

mysql資料庫的四類索引:

index  ----  普通索引,資料可以重複,沒有任何限制。

unique ---- 唯一索引,要求索引列的值必須唯一,但允許有空值;如果是組合索引,那麼列值的組合必須唯一。

primary key ---- 主鍵索引,是一種特殊的唯一索引,乙個表只能有乙個主鍵,不允許有空值,一般是在建立表的同時建立主鍵索引。

組合索引 ----在多個欄位上建立的索引,只有在查詢條件中使用了建立索引時的第乙個字段,索引才會被使用。

fulltext---- 全文索引,是對於大表的文字域:char,varchar,text列才能建立全文索引,主要用於查詢文字中的關鍵字,並不是直接與索引中的值進行比較。fulltext更像是乙個搜尋引擎,配合match against操作使用,而不是一般的where語句加like。

注:全文索引目前只有myisam儲存引擎支援全文索引,innodb引擎5.6以下版本還不支援全文索引

所有儲存引擎對每個表至少支援16個索引,總索引長度至少為256位元組,索引有兩種儲存型別,包括b型樹索引和雜湊索引。

索引可以提高查詢的速度,但是建立和維護索引需要耗費時間,同時也會影響插入的速度,如果需要插入大量的資料時,最好是先刪除索引,插入資料後再建立索引。

索引的建立原則:

選擇唯一性索引。

為經常需要排序(order by),分組(group by)和聯合操作(join)的字段建立索引。

為經常被作為where子句查詢條件的字段建立索引。

限制索引的數目。

盡量使用資料量少的索引。

盡量使用字首來建立索引。如果欄位的值很長,最好使用值的字首來索引,這樣可以大大節約索引空間,從而提高索引效率。其缺點是不能用於order by和group by操作,也不能用於覆蓋索引 covering index(即當索引本身包含查詢所需全部資料時,不再訪問資料檔案本身)。

刪除不再使用或者很少使用的索引。

在不同值較少的字段上不必要建立索引,如性別字段;

盡量不要對資料庫中某個含有大量重複的值的字段建立索引(enum型別的)

對於經常訪問的列避免建立索引;

用於聯接的列(主健/外健)上建立索引;

索引使用注意 :

(1). 對於like語句,以%或者『_』開頭的不會使用索引,以%結尾會使用索引。

(2). 表的主鍵、外來鍵必須有索引。

(3). 不同值越多、同值最少的列建立索引,區分度的公式:count(distinct(字段))/count(*)

(4). 單錶的資料太少,不適合建索引。

(5). where,order by ,group by 等過濾時,後面的字段最好加上索引。

(6). 盡量不要使用 not in和 <> 操作。

(7). 盡量不要在列上進行運算(函式操作和表示式操作)。

(10). 列中包含null值,會導致無法使用到索引。

2. 盡量把字段設定為not null

not in 、!= 等負向條件查詢,如果在有null值的情況下返回永遠為空結果,查詢容易出錯

將來資料庫執行查詢操作的時候,資料庫不用去額外比較null值。

null列需要乙個額外位元組作為判斷是否為null的標誌位,使用null時和該列其他的值可能不是同種型別,導致問題。

避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃瞄

3. 選取最適用的字段屬性

對於那些可能值很有限的列,使用tinyint代替varchar,

比如記錄移動裝置平台,只有兩個值:android,ios,那麼就可以使用0表示android,1表示ios,這種列一定要寫好注釋

為什麼不用enum呢?enum擴充套件困難,比如後來移動平台又增加了乙個ipad,那豈不是懵逼了,而tinyint加個2就行,而且enum在**裡面處理起來特別奇怪,是當成整形呢還是字串,一定要在資料庫注釋或者**裡面寫明各個值的含義

對於那些定長字串,可以使用char,比如郵編,總是5位

對於那些長度未知的字串,使用varchar

不要濫用bigint,比如記錄文章數目的表id欄位,用int就行了

4. 不使用 not in和 <>操作

not in和<>操作都不會使用索引,將會進行全表掃瞄。not in可以not exists代替,id<>3 則可使用 id>3 or id<3 來代替。

5. 使用連線(join)來代替子查詢(sub-queries)

因為使用連線查詢時,mysql不需要在記憶體中建立臨時表來完成查詢邏輯

6. 優化查詢語句

盡量使用簡單的查詢,避免使用表鏈結

多條件查詢時,請把簡單查詢條件或則索引列查詢置於前面

盡量指定需要查詢的列,不要偷懶使用select *

使用子查詢會建立臨時表,會比鏈結(join)和聯合(union)稍慢

在索引欄位上查詢盡量不要使用資料庫函式,不便於快取查詢結果

當只要一行資料時,請使用limit1,如果資料過多,請適當設定limit,分頁查詢.

千萬不要 order by rand(),效能極低

7. 新增快取

對於一些經常訪問到的資料而且不需要經常變化的資料放在快取中,比如配置資訊等,可以放在快取中能節約磁碟io

栗子: a. 可以在本地,快取資料庫的表結構

b. 快取的資料一定要注意及時更新,還有設定有效期

c. 增加快取務必會增加系統複雜性,一定要注意權衡

8. 將會導致全表搜尋的操作

盡量避免在 where 子句中使用 or 來連線條件,如果乙個欄位有索引,乙個字段沒有索引,將導致引擎放棄使用索引而進行全表掃瞄

盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃瞄

盡量避免在 where 子句中使用 like模糊匹配 != 或 <> 操作符,否則將引擎放棄使用索引而進行全表掃瞄

in 和 not in 也要慎用,否則會導致全表掃瞄

對於連續的數值,能用 between 就不要用 in , 用 exists 代替 in

在 where 子句中使用引數,也會導致全表掃瞄,例如:select id from t where num = @num , 修改為: select id from t with(index(索引名)) where num = @num

盡量避免在 where 子句中對字段進行表示式操作,這將導致引擎放棄使用索引而進行全表掃瞄,例如:select id from t where num/2 = 100 , 修改為 : select id from t where num = 100*2

盡量避免在where子句中對字段進行函式操作,這將導致引擎放棄使用索引而進行全表掃瞄

不要在 where 子句中的「=」左邊進行函式、算術運算或其他表示式運算,否則系統將可能無法正確使用索引

9. 使用merge儲存引擎實現分表

a. 將大表拆分為多張小表

b. 將耦合度過高的表進行分離

c. 垂直分表:不經常讀取的資料放入一張表中,提高磁碟讀取效率。

10. 主從分離:採用主從分離模式,將資料庫的查詢操作和寫入操作分離

11. 進行架構級別的快取,頁面靜態化和分布式儲存

12. 速度優先順序

cpu執行速度 > 記憶體訪問速度 > 磁碟io訪問速度 > 網路請求速度

mysql資料庫優先 MySQL 優先條件

我有乙個名為term的表,其id,名稱,school id和klass id為屬性.我想返回滿足條件之一的記錄.在詳細解釋問題之前,請看一下表輸出 id name school id klass id 1 term1 null null 2 term2 null null 3 term1 1 4 4...

mysql資料庫效能資料 MYSQL資料庫效能優化

1.選取最適用的字段屬性 表中字段的寬度設得盡可能小 char 的上限為 255 位元組 固定占用空間 varchar 的上限 65535 位元組 實際占用空間 text 的上限為 65535。盡量把字段設定為 not null,執行查詢的時候,資料庫不用去比較 null 值。2.使用連線 join...

MySQL資料庫使用 MySQL資料庫管理

開發時一般不使用系統的root使用者,應該是建立乙個新的使用者,管理乙個工程。登入使用者的命令 mysql uusername p 登入完成後就進入sql命令格式,格式以 結尾。windows用安裝的時候設定的root登入命令列,如下圖所示。linux安裝時若沒有提示設定root密碼的,可以使用系統...