久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

怎么優化Mysql數據庫

145次閱讀
沒有評論

共計 2645 個字符,預計需要花費 7 分鐘才能閱讀完成。

自動寫代碼機器人,免費開通

這篇文章將為大家詳細講解有關怎么優化 Mysql 數據庫,丸趣 TV 小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

學無止境,數據庫優化分為方方面面,在這里,我進行了比較全的總結,分享給正在工作或者學習的同行們。

數據庫的優化分為以下七大方面:

1、表的設計要符合三范式(適當的反三范式也可以);

2、添加適當的索引,索引對查詢速度影響很大,必須添加索引(主鍵索引,唯一索引,普通索引,全文索引);

3、添加適當存儲過程,觸發器,事務等;

4、讀寫分離(主從數據庫);

5、對 sql 語句的一些優化,(查詢執行速度比較慢的 sql 語句);

6、分表分區(分表:把一張大表分成多張表。分區:把一張表里面的分配到不同的區域存儲);

7、對 mysql 服務器硬件的升級操作。

接下來我將具體講解優化的方式。

一、三范式

第一范式:

原子性:表里面的字段不能再分割,只要是關系型數據庫,就天然的自動滿足第一范式

關系型數據庫(有行和列的概念):mysql、sql server、oracle、db2、infomix、sybase、postgresql,在設計時,先有庫 - 表 - 字段 - 具體記錄(內容):在存儲數據時,要設計字段。

非關系型數據庫(泛指 nosql 數據庫):memcache、redis、momgodb 等。

第二范式:

一個表中沒有完全相同的記錄,通過一個主鍵即能解決

第三范式:

表中不能存儲冗余數據

反三范式設計:

相冊表 ID 相冊名稱相冊瀏覽量 1 生活照 1002 工作照 100 照片表 ID 照片名稱相冊 ID 瀏覽量 1 我的小狗 1492 我的小貓 1513 我的同事 2100

如果要算一個相冊的瀏覽量,我們可以在相冊表中添加相冊瀏覽量字段,瀏覽照片的時候同時更新相冊瀏覽量。

二、開啟慢查詢

Mysql 慢查詢默認是關閉的,默認記錄超過 10 秒的 sql 語句。

1. 查看慢查詢記錄時間:

show variables like‘long_query_time’;

2. 修改慢查詢時間:

set long_query_time=2;

3. 通過如下的一個函數來進行測試:

benchmark(count,expr) 函數可以測試執行 count 次 expr 操作需要的時間 

三、建立索引

1、主鍵索引的特點:

(1) 一個表中最多只有一個主鍵索引

(2) 一個主鍵索引可以指向多個列

(3) 主鍵索引的列,不能有重復的值,也不能有 null

(4) 主鍵索引的效率高。

2、唯一索引的特點:

(1) 一個表中可以有多個唯一索引

(2) 一個唯一索引可以指向多個列,

(3) 如果在唯一索引上,沒有指定 not null,則該列可以為空,同時可以有多個 null,

(4) 唯一索引的效率較高。

3、普通索引:

使用普通索引主要是提高查詢效率

4、全文索引

mysql 自帶的全文索引 mysql5.5 不支持中文,支持英文,同時要求表的存儲引擎是 myisam。如果希望支持中文,有兩個方案,

(1) 使用 aphinx 中文版 coreseek (來替代全文索引)

(2) 插件 mysqlcft。

添加索引主要的問題:

(1) 較頻繁的作為查詢條件字段應該創建索引,唯一性太差的字段不適合單獨創建索引,即使頻繁作為查詢條件,更新非常頻繁的字段不適合創建索引

(2) 不會出現在 WHERE 子句中字段不該創建索,索引是由代價的,雖然是查詢速度提高了,但是,會影響增該刪的效率。而且索引文件會占用空間。

四、分表、分區

垂直分表(內容主表 + 附加表):

內容主表:存儲各種數據的一些公共信息,比如數據的名稱,添加時間等,

可以使用多個附加表,附加表存儲一些數據的獨特的信息。

主要原因:是內容主表里面的數據訪問比較頻繁。

特點:表結構不同

水平分表:

將表數據存在不同的表中。

特點:表結構相同

分區:

就是把一個表存儲到磁盤不同區域,仍然是一張表。

基本的概念:

(1)Range(范圍)–這種模式允許將數據劃分不同范圍。例如可以將一個表通過年份劃分成若干個分區。

(2)List(預定義列表)–這種模式允許系統通過預定義的列表的值來對數據進行分割。

(3)Hash(哈希)–這中模式允許通過對表的一個或多個列的 Hash Key 進行計算,最后通過這個 Hash 碼不同數值對應的數據區域進行分區。例如可以建立一個對表主鍵進行分區的表。

(4)Key(鍵值)- 上面 Hash 模式的一種延伸,這里的 Hash Key 是 MySQL 系統產生的。

分區表的限制:

(1) 只能對數據表的整型列進行分區,或者數據列可以通過分區函數轉化成整型列。

(2) 最大分區數目不能超過 1024。

(3) 如果含有唯一索引或者主鍵,則分區列必須包含在所有的唯一索引或者主鍵在內。

(4) 按日期進行分區很非常適合,因為很多日期函數可以用。但是對于字符串來說合適的分區函數不太多。

五、并發處理的鎖機制

鎖機制:在執行時,只有一個用戶獲得鎖,其他用戶處于阻塞狀態,需要等待解鎖。

mysql 的鎖有以下幾種形式:

表級鎖:開銷小,加鎖快,發生鎖沖突的概率最高,并發度最低。myisam 引擎屬于這種類型。

行級鎖:開銷大,加鎖慢,發生鎖沖突的概率最低,并發度也最高。innodb 屬于這種類型。

表鎖的演示:

1. 對 myisam 表的讀操作(加讀鎖),不會阻塞其他進程對同一表的讀請求,但會阻塞對同一表的寫請求。只有當讀鎖釋放后,才會執行其他進程的操作。

2. 表添加讀鎖后,其他進程對該表只能查詢操作,修改時會被阻塞。

3. 當前進程,能夠執行查詢操作,不能執行修改操作。不能對沒有鎖定的表進行操作。

4. 鎖表的語法:

lock table 表名 read|write

5. 也可以鎖定多個表

6. 對 myisam 表的寫操作(加寫鎖),會阻塞其他進程對鎖定表的任何操作,不能讀寫,

7. 表加寫鎖后,則只有當前進程對鎖定的表,可以執行任何操作。其他進程的操作會被阻塞。

行鎖的演示:

1.innodb 存儲引擎是通過給索引上的索引項加鎖來實現的,這就意味著:只有通過索引條件檢索數據,innodb 才會使用行級鎖,否則,innodb 使用表鎖。

2. 開啟行鎖后,當前進程在針對某條記錄執行操作時,其他進程不能操作和當前進程相同 id 的記錄。

php 里面有文件鎖,在實際的項目中多數使用文件鎖,因為表鎖,會阻塞,當對一些表添加寫鎖后,其他進程就不能操作了。這樣會阻塞整個網站,會拖慢網站的速度。

關于怎么優化 Mysql 數據庫就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向 AI 問一下細節

丸趣 TV 網 – 提供最優質的資源集合!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-12-18發表,共計2645字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 鹤庆县| 饶平县| 白银市| 玛沁县| 怀来县| 西乌珠穆沁旗| 南投县| 栾川县| 进贤县| 屏边| 江陵县| 尉犁县| 庆云县| 海兴县| 武冈市| 永济市| 佛冈县| 静海县| 吉林省| 远安县| 安康市| 三河市| 仙居县| 玉环县| 项城市| 怀集县| 班戈县| 双柏县| 枣强县| 千阳县| 玉树县| 都江堰市| 安康市| 昌乐县| 新密市| 都昌县| 陕西省| 玉山县| 刚察县| 邵阳市| 务川|