Mysql資料庫設計及常見問題

2021-08-20 05:37:59 字數 3003 閱讀 8152

一、庫表設計

1.1 引擎選擇

在mysql5.1中,引入了新的外掛程式式儲存引擎體系結構,允許將儲存引擎載入到正在執行的mysql伺服器中。使用mysql外掛程式式儲存引擎體系結構,允許資料庫專業人員或者設計庫表的軟體開發人員為特定的應用需求選擇專門的儲存引擎,完全不需要管理任何特殊的應用編碼要求,也不用考慮所有的底層實施細節。

因此,儘管不同的儲存引擎具有不同的能力,應該用程式是與之分離的。此外,使用者可以在伺服器、資料庫和**三個層級中儲存引擎,提供了極大的靈活性。

mysql常用的儲存引擎包括myisam、innodb和memory,其中有一下特點:

myisam:全表鎖擁有較高的執行速度,乙個寫請求,其他的相同**的所有讀寫請求救護阻塞,併發性差,占用空間相對較小,mysql5.5及以下僅myisam支援全文索引,不支援事務。

innodb:行級鎖(sql都走索引查詢),併發性相對強,占用空間是myisam的2.5倍,不支援全文索引(5.6開始支援)。

memory全表鎖,儲存在記憶體當中,速度快,但是占用的資料量成正比的記憶體空間,且資料在mysql重啟時會丟失。

建議一般業務都使用innodb,如要支援全文索引和執行效率高考慮myisam和memory。

1.2 分表方法

在資料庫變使用過程中,為減少資料庫伺服器的負擔、縮短查詢時間,常常會考慮做分表設計。分表分兩種,一種是縱向分表(將本來可以在同乙個表的內容,人為劃分儲存為多張表中)和橫向分表(把大的表結構,橫向切割同樣結構的不同表)。

1、縱向分表主要解決以下問題

- 表與表之間資源爭用的問題;

- 鎖爭用機率小;

- 實現核心與非核心的分級儲存,如udb登入庫拆分為一級二級**庫;

- 解決了資料庫同步壓力的問題;

2、橫向分表主要解決以下問題:

- 單錶過大造成的效能問題;

- 單錶過大造成的單伺服器的問題;

1.3 索引問題

索引是對資料庫表中乙個或多個列的值進行排序的結構,建立索引有助於更快地獲取資訊。

mysql有四種不同的索引型別:

- 主鍵索引(primary)

- 唯一索引(unique)

- 普通索引(index)

- 全文索引(fulltext)

建立索引的目的是加快對錶中記錄的查詢或排序,索引也並非越多越好,因為建立索引是要付出代價的:一、增加資料庫的儲存空間;二、在插入和修改資料時要花費較多的時間維護索引。

在設計表或索引時,常出現以下幾個問題:

- 少建索引或不建索引。

- 索引濫用。

- 不考慮聯合索引,實際上聯合索引的效率要比單列索引的效率高。

- 非最優列選擇。

二、慢 sql 問題

2.1 導致慢 sql 的原因

在遇到慢 sql 情況時,不能簡單的把原因歸結為 sql 編寫問題(雖然這是最常見的因素),實際上導致慢 sql 有很多因素,甚至包括硬體和 mysql 本身的 bug。根據出現的概率從大到小,羅列如下:

sql編寫問題

鎖 業務例項相互幹繞對 io/cpu 資源爭用

伺服器硬體

mysql bug

2.2 由 sql 編寫導致的慢 sql 優化

針對sql編寫導致的慢 sql,優化起來還是相對比較方便的。正如上一節提到的正確的使用索引能加快查詢速度,那麼我們在編寫 sql 時就需要注意與索引相關的規則:

字段型別轉換導致不用索引,如字串型別的不用引號,數字型別的用引號等,這有可能會用不到索引導致全表掃瞄;

mysql 不支援函式轉換,所以字段前面不能加函式,否則這將用不到索引;

不要在字段前面加減運算;

字串比較長的可以考慮索引一部份減少索引檔案大小,提高寫入效率;

like % 在前面用不到索引;

根據聯合索引的第二個及以後的字段單獨查詢用不到索引;

不要使用 select *;

排序請盡量使用公升序 ;

or 的查詢盡量用 union 代替 (innodb);

復合索引高選擇性的字段排在前面;

order by / group by 字段包括在索引當中減少排序,效率會更高。

除了上述索引使用規則外,sql 編寫時還需要特別注意一下幾點:

盡量規避大事務的 sql,大事務的 sql 會影響資料庫的併發效能及主從同步;

分頁語句 limit 的問題;

刪除表所有記錄請用 truncate,不要用 delete;

不讓 mysql 幹多餘的事情,如計算;

輸寫 sql 帶欄位,以防止後面表變更帶來的問題,效能也是比較優的 ( 涉及到資料字典解析,請自行查詢資料);

在 innodb上用 select count(*),因為 innodb 會儲存統計資訊;

慎用 oder by rand()。

三、分析診斷工具

在日常開發工作中,我們可以做一些工作達到預防慢 sql 問題,比如在上線前預先用診斷工具對 sql 進行分析。常用的工具有:

mysqldumpslow

mysql profile

mysql explain

具體使用及分析方法在此就不贅述,網上有豐富的資源可以參考。

四、誤操作、程式 bug 時怎麼辦

提出這個問題顯然主要是針對剛開始工作的年輕同行們……實際上誤操作和程式 bug 導致資料誤刪或者混亂的問題並非少見,但是剛入行的開發工作者會比較緊張。乙個成熟的企業往往會有完善的資料管理規範和較豐富的資料恢復方案(初創公司除外),會進行資料備份和資料容災。

當你發現誤操作或程式 bug 導致線上資料被誤刪或誤改動時,一定不能慌亂,應及時與 dba 聯絡,第一時間進行資料恢復(嚴重時直接停止服務),盡可能減少影響和損失。對於重要資料(如資金)的操作,在開發時一定要反覆進行測試,確保沒有問題後再上線。

MySQL資料庫開發常見問題及優化

庫表設計 慢 sql 問題 誤操作 程式 bug 時怎麼辦 一 庫表設計 1.1 引擎選擇 在 mysql 5.1 中,引入了新的外掛程式式儲存引擎體系結構,允許將儲存引擎載入到正在運新的 mysql 伺服器中。使用 mysql 外掛程式式儲存引擎體系結構,允許資料庫專業人員或者設計庫表的軟體開發人...

mysql資料庫開發常見問題及優化

mysql 資料庫是被廣泛應用的關係型資料庫,其體積小 支援多處理器 開源並免費的特性使其在 internet 中小型 中的使用率尤其高。在使用 mysql 的過程中不規範的 sql 編寫 非最優的策略選擇都可能導致系統效能甚至功能上的缺陷。恰巧就在前幾天,本人所在公司的雲事業部舉辦了一場關於 my...

mysql資料庫開發常見問題及優化

mysql 資料庫是被廣泛應用的關係型資料庫,其體積小 支援多處理器 開源並免費的特性使其在 internet 中小型 中的使用率尤其高。在使用 mysql 的過程中不規範的 sql 編寫 非最優的策略選擇都可能導致系統效能甚至功能上的缺陷。恰巧就在前幾天,本人所在公司的雲事業部舉辦了一場關於 my...