首頁 資料庫 mysql教程 mysql 單機資料庫優化的一些實踐_MySQL

mysql 單機資料庫優化的一些實踐_MySQL

Oct 09, 2016 am 08:33 AM
mysql

資料庫最佳化有很多可以講,依照支撐的資料量來分可以分成兩個階段:單機資料庫和分庫分錶,前者一般可以支撐500W或10G以內的數據,超過這個值則需要考慮分庫分表。另外,一般大企業面試往往會從單機資料庫問起,一步一步問到分庫分錶,中間會穿插很多資料庫優化的問題。本文試圖描述單機資料庫最佳化的一些實踐,資料庫基於mysql,如有不合理的地方,歡迎指正。

1、表結構最佳化

在開始做一個應用的時候,資料庫的表結構設計往往會影響應用程式後期的效能,特別是使用者量上來了以後的效能。因此,表結構優化是一個很重要的步驟。

1.1、字符集

一般來說盡量選擇UTF-8,雖然在存中午的時候GBK比UTF-8使用的存儲空間少,但是UTF-8兼容各國語言,其實我們不必為了這點存儲空間而犧牲了擴展性。事實上,後期如果要從GBK轉為UTF-8所要付出的代價是很高的,需要進行資料遷移,而儲存空間完全可以用花錢擴充硬碟來解決。

1.2、主鍵

在使用mysql的innodb的時候,innodb的底層儲存模型是B+樹,它使用主鍵作為聚集索引,使用插入的資料作為葉子節點,透過主鍵可以很快找到葉子節點,從而快速取得記錄。因此在設計表的時候需要增加一個主鍵,而且最好要自增。因為自增主鍵可以讓插入的資料以主鍵順序插入到底層的B+樹的葉子節點中,由於是按序的,這種插入幾乎不需要去移動已有的其它數據,所以插入效率很高。如果主鍵不是自增的,那麼每次主鍵的值近似隨機,這時候就有可能需要移動大量資料來確保B+樹的特性,增加了不必要的開銷。

1.3、字段

1.3.1、建了索引的欄位必須加上not null約束,並且設定default值

1.3.2、不建議使用float、double來存小數,防止精度損失,建議使用decimal

1.3.3、不建議使用Text/blob來保存大量數據,因為對大文本的讀寫會造成比較大的I/O開銷,同時佔用mysql的緩存,高並發下會極大的降低數據庫的吞吐量,建議將大文本資料保存在專門的文件存儲系統中,mysql中只保存這個文件的訪問地址,例如博客文章可以保存在文件中,mysql中只保存文件的相對地址。

1.3.4、varchar類型長度建議不要超過8K。

1.3.5、時間類型建議使用Datetime,不要使用timestamp,雖然Datetime佔用8個字節,而timestamp只佔用4個字節,但是後者要保證非空,而且後者是對時區敏感的。

1.3.6、建議表中增加gmt_create和gmt_modified兩個字段,用來記錄資料建立的修改時間。這兩個欄位建立的原因是方便查問題。

1.4、索引建立

1.4.1、這個階段由於對業務並不了解,所以盡量不要盲目加索引,只為一些一定會用到索引的字段加普通索引。

1.4.2、建立innodb單列索引的長度不要超過767bytes,如果超過會用前255bytes作為前綴索引

1.4.3、建立innodb組合索引的各列索引長度不要超過767bytes,總共加起來不要超過3072bytes

2、SQL最佳化

一般來說sql就那麼幾種:基本的增刪改查,分頁查詢,範圍查詢,模糊搜索,多表連接

2.1、基本查詢

一般查詢需要走索引,如果沒有索引建議修改查詢,把有索引的那個字段加上,如果由於業務場景沒法使用這個字段,那麼需要看這個查詢調用量大不大,如果大,比如每天調用10W+,這就需要新增索引,如果不大,例如每天呼叫100+,則可以考慮保持原樣。另外,select * 盡量少用,用到什麼欄位就在sql語句加什麼,不必要的欄位就別查了,浪費I/O和記憶體空間。

2.2、高效分頁

limit m,n其實質就是先執行limit m+n,然後從第m行取n行,這樣當limit翻頁越往後翻m越大,性能越低。如

select * from A limit 100000,10,這種sql語句的效能是很差的,建議改成下面的版本:

selec id,name,age from A where id >=(select id from A limit 100000,1) limit 10

2.3、範圍查詢

範圍查詢包括between、大於、小於、in。 Mysql中的in查詢的條件有數量的限制,若數量較小可以走索引查詢,若數量較大,就成了全表掃描了。而between、大於、小於等,這些查詢不會走索引,所以盡量放在走索引的查詢條件之後。

2.4、模糊查詢like

使用like %name%這樣的語句是不會走索引的,相當於全表掃描,資料量小的時候不會有太大的問題,資料量大了以後效能會下降的很厲害,建議資料量大了以後使用搜尋引擎來代替這種模糊搜索,實在不行也要在模糊查詢前加個能走索引的條件。

2.5、多表連接

子查詢和join都可以實現在多張表之間取數據,但是子查詢效能較差,建議將子查詢改成join。對於mysql的join,它用的是Nested Loop Join演算法,也就是透過前一個表格查詢的結果集去後一個表中查詢,例如前一個表的結果集是100條數據,後一個表有10W數據,那就需要在100*10W的資料集合中去過濾得到最終的結果集。因此,盡量用小結果集的表去和大表做join,同時在join的欄位上建立索引,如果建不了索引,就需要設定足夠大的join buffer size。如果以上的技巧都無法解決join所帶來的效能下降的問題,那乾脆就別用join了,將一次join查詢拆分成兩次簡單查詢。另外,多表連接盡量不要超過三張表,超過三張表一般來說會很差,建議拆分sql。

3、資料庫連接池最佳化

資料庫連接池本質上是一種緩存,它是一種抗高並發的手段。資料庫連線池最佳化主要是對參數進行最佳化,一般我們使用DBCP連線池,它的具體參數如下:

3.1  initialSize

初始連線數,這裡的初始指的是第一次getConnection的時候,而不是應用啟動的時候。初始值可以設定為同時數量的歷史平均值

3.2、minIdle

最小保留的空閒連線數。 DBCP會在背景開啟一個回收空閒連線的線程,當該執行緒進行空閒連線回收的時候,會保留minIdle個連線數。一般設定為5,並發量實在很小可以設定為1.

3.3、maxIdle

最大保留的空閒連線數,依照業務並發高峰設定。例如並發高峰為20,那麼當高峰過去後,這些連接不會馬上被回收,如果過一小段時間又來一個高峰,那麼連接池就可以復用這些空閒連接而不需要頻繁創建和關閉連接。

3.4、maxActive

最大活躍連線數,依照可以接受的並發極值設定。例如單機並發量可接受的極值是100,那麼這個maxActive設定成100後,就只能同時為100個請求服務,多餘的請求會在最大等待時間之後被拋棄。這個值必須設置,可以防止惡意的並發攻擊,保護資料庫。

3.5、maxWait

取得連線的最大等待時間,建議設定的短一點,例如3s,這樣可以讓請求快速失敗,因為一個請求在等待取得連線的時候,執行緒是不可以被釋放的,而單機的執行緒並發量是有限的,如果這個時間設定的過長,例如網上建議的60s,那麼這個線程在這60s內是無法被釋放的,只要這種請求一多,應用的可用線程就少了,服務就變得不可用了。

3.6、minEvictableIdleTimeMillis

連線保持空閒而不被回收的時間,預設30分鐘。

3.7、validationQuery

用來偵測連線是否有效的sql語句,一般是一條簡單的sql,建議設定

3.8、testOnBorrow

申請連線的時候對連線進行偵測,不建議開啟,嚴重影響效能

3.9、testOnReturn

歸還連線的時候對連線進行偵測,不建議開啟,嚴重影響效能

3.10、testWhileIdle

開啟了以後,後台清理連線的執行緒會沒隔一段時間對空閒連線進行validateObject,如果連線失效則會清除,不影響效能,建議開啟

3.11、numTestsPerEvictionRun

代表每次檢查連結的數量,建議設定和max​​Active一樣大,這樣每次可以有效檢查所有的連結。

3.12、預熱連接池

對於連接池,建議在啟動應用的時候進行預熱,在還未對外提供訪問之前進行簡單的sql查詢,讓連接池充滿必要的連接數。

4、索引最佳化

當資料量增加到一定程度後,靠sql優化已經無法提升效能了,這時候就需要祭出大招:索引。索引有三級,一般來說掌握這三級就足夠了,另外,對於建立索引的字段,需要考慮其選擇性。

4.1、一級索引

在where後面的條件上建立索引,單列可以建立普通索引,多列則建立組合索引。組合索引需要注意最左前綴原則。

4.2、二級索引

如果有被order by或group by用到的字段,則可以考慮在這個字段上建立索引,這樣一來,由於索引天然有序,可以避免order by以及group by所帶來的排序,從而提高性能。

4.3、三級索引

如果上面兩招還不行,那麼就把所查詢的字段也加上索引,這時候就形成了所謂的索引覆蓋,這樣做可以減少一次I/O操作,因為mysql在查詢資料的時候,是先查主鍵索引,然後根據主鍵索引去查普通索引,然後根據普通索引去查相對應的記錄。如果我們所需要的記錄在普通索引裡都有,那就不需要第三步了。當然,這種建索引的方式比較極端,不適合一般場景。

4.4、索引的選擇性

在建立索引的時候,盡量在選擇性高的字段上建立。什麼是選擇性高呢?所謂選擇性高就是透過這個字段查出來的資料量少,例如依照名字查一個人的信息,查出來的資料量一般會很少,而依照性別查則可能會把資料庫一半的資料都查出來,所以,名字是一個選擇性高的字段,而性別是個選擇性低的字段。

5、歷史資料歸檔

當資料量到了一年增加500W條的時候,索引也無能為力,這時候一般的思路都是考慮分庫分錶。如果業務沒有爆發式成長,但是資料的確在緩慢增加,則可以不考慮分庫分錶這種複雜的技術手段,而是進行歷史資料歸檔。我們針對生命週期已經完成的歷史數據,例如6個月之前的數據,進行歸檔。我們可以使用quartz的調度任務在凌晨定時將6個月之前的資料查出來,然後存入遠端的hbase伺服器。當然,我們也需要提供歷史資料的查詢接口,以備不時之需。

以上就是對mysql 單機資料庫的最佳化資料整理,後續繼續補充相關資料,謝謝大家對本站的支持!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
<🎜>掩蓋:探險33-如何獲得完美的色度催化劑
2 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1677
14
CakePHP 教程
1430
52
Laravel 教程
1333
25
PHP教程
1278
29
C# 教程
1257
24
laravel入門實例 laravel入門實例 Apr 18, 2025 pm 12:45 PM

Laravel 是一款 PHP 框架,用於輕鬆構建 Web 應用程序。它提供一系列強大的功能,包括:安裝: 使用 Composer 全局安裝 Laravel CLI,並在項目目錄中創建應用程序。路由: 在 routes/web.php 中定義 URL 和處理函數之間的關係。視圖: 在 resources/views 中創建視圖以呈現應用程序的界面。數據庫集成: 提供與 MySQL 等數據庫的開箱即用集成,並使用遷移來創建和修改表。模型和控制器: 模型表示數據庫實體,控制器處理 HTTP 請求。

MySQL和PhpMyAdmin:核心功能和功能 MySQL和PhpMyAdmin:核心功能和功能 Apr 22, 2025 am 12:12 AM

MySQL和phpMyAdmin是強大的數據庫管理工具。 1)MySQL用於創建數據庫和表、執行DML和SQL查詢。 2)phpMyAdmin提供直觀界面進行數據庫管理、表結構管理、數據操作和用戶權限管理。

MySQL與其他編程語言:一種比較 MySQL與其他編程語言:一種比較 Apr 19, 2025 am 12:22 AM

MySQL与其他编程语言相比,主要用于存储和管理数据,而其他语言如Python、Java、C 则用于逻辑处理和应用开发。MySQL以其高性能、可扩展性和跨平台支持著称,适合数据管理需求,而其他语言在各自领域如数据分析、企业应用和系统编程中各有优势。

laravel框架安裝方法 laravel框架安裝方法 Apr 18, 2025 pm 12:54 PM

文章摘要:本文提供了詳細分步說明,指導讀者如何輕鬆安裝 Laravel 框架。 Laravel 是一個功能強大的 PHP 框架,它 упростил 和加快了 web 應用程序的開發過程。本教程涵蓋了從系統要求到配置數據庫和設置路由等各個方面的安裝過程。通過遵循這些步驟,讀者可以快速高效地為他們的 Laravel 項目打下堅實的基礎。

在MySQL中解釋外鍵的目的。 在MySQL中解釋外鍵的目的。 Apr 25, 2025 am 12:17 AM

在MySQL中,外鍵的作用是建立表與表之間的關係,確保數據的一致性和完整性。外鍵通過引用完整性檢查和級聯操作維護數據的有效性,使用時需注意性能優化和避免常見錯誤。

比較和對比Mysql和Mariadb。 比較和對比Mysql和Mariadb。 Apr 26, 2025 am 12:08 AM

MySQL和MariaDB的主要區別在於性能、功能和許可證:1.MySQL由Oracle開發,MariaDB是其分支。 2.MariaDB在高負載環境中性能可能更好。 3.MariaDB提供了更多的存儲引擎和功能。 4.MySQL採用雙重許可證,MariaDB完全開源。選擇時應考慮現有基礎設施、性能需求、功能需求和許可證成本。

yi框架用什麼軟件比較好 yi框架使用軟件推薦 yi框架用什麼軟件比較好 yi框架使用軟件推薦 Apr 18, 2025 pm 11:03 PM

文章首段摘要:在選擇開發 Yi 框架應用程序的軟件時,需要考慮多個因素。雖然原生移動應用程序開發工具(如 XCode 和 Android Studio)可以提供強大的控制和靈活性,但跨平台框架(如 React Native 和 Flutter)憑藉其編寫一次,即可部署到多個平台的優點而越來越受歡迎。對於剛接觸移動開發的開發者,低代碼或無代碼平台(如 AppSheet 和 Glide)可以快速輕鬆地構建應用程序。另外,雲服務提供商(如 AWS Amplify 和 Firebase)提供了全面的工具

SQL與MySQL:澄清兩者之間的關係 SQL與MySQL:澄清兩者之間的關係 Apr 24, 2025 am 12:02 AM

SQL是一種用於管理關係數據庫的標準語言,而MySQL是一個使用SQL的數據庫管理系統。 SQL定義了與數據庫交互的方式,包括CRUD操作,而MySQL實現了SQL標準並提供了額外的功能,如存儲過程和触發器。

See all articles