mysql性能結構優化原理_MySQL性能管理及架構設計(二):數據庫結構優化、高可用架構設計、數據庫索引優化...

一、數據庫結構優化(非常重要)

1.1 數據庫結構優化目的

1、減少數據冗余:(數據冗余是指在數據庫中存在相同的數據,或者某些數據可以由其他數據計算得到),注意,盡量減少不代表完全避免數據冗余;

2、盡量避免數據維護中出現更新,插入和刪除異常:

b96801303e09ac5fa9ebfca030cac490.png

總結:要避免異常,需要對數據庫結構進行范式化設計。

3、節約數據存儲空間。

4、提高查詢效率。

1.2 數據庫結構設計步驟

1、需求分析:全面了解產品設計的存儲需求、數據處理需求、數據安全性與完整性;

2、邏輯設計(重要):設計數據的邏輯存儲結構。數據實體之間的邏輯關系,解決數據冗余和數據維護異常。數據范式可以幫助我們設計;

3、物理設計:表結構設計,存儲引擎與列的數據類型;

4、維護優化:索引優化、存儲結構優化。

1.3 數據庫范式設計與反范式化

1.4 物理設計

b05a26a9f9e40b38a10ec7a1b6e1aa34.png

48452fc4e57724913cebab166d1d4580.png

70375049a48b10c6afaaa84db8528c26.png

二、高可用架構設計

d7f8fd207f0a1ad87c3697acb8963be1.png

e1ebff50e769f9e8a0587477e19a9d48.png

2.1 讀寫分離

a63954abebd19aafe556ac568d3d37c4.png

三、數據庫索引優化(非常重要)

3.1 兩種主要數據結構:B-tree和Hash

3.1.1 B-tree結構

50354291334f20cfb6de96f431644bc0.png

B-tree索引的限制:

08be9d8aff9ce57ef36ec71aa80de5fd.png

3.1.2 Hash結構

44927d09f93a3e27e459f6e8a6902aee.png

Hash索引的限制:

Hash索引必須進行二次查找

Hash索引無法用于排序

Hash索引不支持部分索引查找也不支持范圍查找

Hash索引中Hash碼的計算可能存在Hash沖突,不適合重復值很高的列,如性別,身份證比較合適。

3.1.3 MySQL常見索引和各種索引區別

PRIMARY KEY(主鍵索引) ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )

UNIQUE(唯一索引) ALTER TABLE `table_name` ADD UNIQUE (`column`)

INDEX(普通索引) ALTER TABLE `table_name` ADD INDEX index_name ( `column` )

FULLTEXT(全文索引) ALTER TABLE `table_name` ADD FULLTEXT ( `column` )

組合索引 ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )

普通索引:最基本的索引,沒有任何限制

唯一索引:與"普通索引"類似,不同的就是:索引列的值必須唯一,但允許有空值。

主鍵索引:它 是一種特殊的唯一索引,不允許有空值。

全文索引:僅可用于 MyISAM 表,針對較大的數據,生成全文索引很耗時好空間。

組合索引:為了更多的提高mysql效率可建立組合索引,遵循”最左前綴“原則。

3.2 使用索引好處和索引缺陷

3.2.1 為什么要使用索引

1、索引大大減少了存儲引擎需要掃描的數據量;

2、索引可以幫助我們進行排序以避免使用臨時表;

3、索引可以把隨機I/O變為順序I/O。

3.2.2 索引不是越多越好

1、索引會增加寫操作的成本;

2、太多的索引會增加查詢優化器的選擇時間。

索引就好比一本書的目錄,它會讓你更快的找到內容,顯然目錄(索引)并不是越多越好,假如這本書1000頁,而有500頁是目錄,它當然效率低,目錄是要占紙張的,而索引是要占磁盤空間的。

3.3 索引優化策略

3.3.1 索引列上不能使用表達式和函數

f5581f3e12361861120c8e187d96e746.png

3.3.2 前綴索引和索引列的選擇性

Innodb索引列最大寬度為667個字節(utf-8 差不多255個字符),MyIsam索引類寬度最大為1000個字節,于是出現前綴索引,索引的選擇性。

對于列的值較長,比如BLOB、TEXT、VARCHAR,就必須建立前綴索引,即將值的前一部分作為索引。這樣既可以節約空間,又可以提高查詢效率。但無法使用前綴索引做 ORDER BY 和 GROUP BY,也無法使用前綴索引做覆蓋掃描。

語法: ALTER TABLE table_name ADD KEY(column_name(prefix_length))

8bf3c98a75968e5dca636bb97e1385be.png

如何選擇索引列的順序:

1、經常會被使用到的列優先(選擇性差的列不適合,如性別,查詢優化器可能會認為全表掃描性能更好);

2、選擇性高的列優先;

3、寬度小的列優先(一頁中存儲的索引越多,降低I/O,查找越快);

3.3.3 組合/聯合索引策略

如果索引了多列,要遵守最左前綴法則。指的是查詢從索引的最左前列開始并且不跳過索引中的列。

深入理解請移步:最左前綴原理與相關優化

3.3.4 覆蓋索引策略

跟組合索引有點類似,如果索引包含所有滿足查詢需要的數據的索引則成為覆蓋索引(Covering Index),也就是平時所說的不需要回表操作。即索引的葉子節點上面包含了他們索引的數據(hash索引不可以)。

判斷標準:使用explain,可以通過輸出的extra列來判斷,對于一個索引覆蓋查詢,顯示為using index,MySQL查詢優化器在執行查詢前會決定是否有索引覆蓋查詢。

優點:

1、可以優化緩存,減少磁盤IO操作;

2、可以減少隨機IO,變隨機IO操作變為順序IO操作;

3、可以避免對InnoDB主鍵索引的二次查詢;

4、可以避免MyISAM表進行系統調用;

無法使用覆蓋索引的情況:

1、存儲引擎不支持覆蓋索引;

2、查詢中使用了太多的列(如SELECT * );

3、使用了雙%號的like查詢(底層API所限制);

3.3.5 SQL索引優化總結口訣(套路重點)

全值匹配我最愛,最左前綴要遵守;

帶頭大哥不能死,中間兄弟不能斷;

索引列上不計算,范圍之后全失效;

LIKE百分寫最右,覆蓋索引不寫 *;

不等空值還有or,索引失效要少用;

字符單引不可丟,SQL高級也不難 ;

3.4 使用索引來優化查詢

3.4.1 利用索引排序

1、group by 實質是先排序后分組,遵照索引的最佳左前綴。;

2、索引中所有列的方向(升序、降序)和Order By子句完全一致;

3、當無法使用索引列,增大max_length_for_sort_data參數的設置+增大sort_buffer_size參數的設置;

4、如果最左列使用了范圍,則排序會失效;

5、where 高于having,能寫在where限定的條件就不要去having去限定了

3.5 索引的維護和優化

3.5.1 刪除重復索引

124b3522607b08b824a5ea2eb48a737c.png

注:主鍵約束相當于(唯一約束 + 非空約束)

一張表中最多有一個主鍵約束,如果設置多個主鍵,就會出現如下提示:Multiple primary key defined!!!

3.5.2 刪除冗余索引

91e897aac7c2e5a8688fe798306acfe1.png

檢查工具:pt-duplicate-key-checker

explain 查詢計劃

Using where:表示優化器需要通過索引回表查詢數據;

Using index:表示直接訪問索引就足夠獲取到所需要的數據,不需要通過索引回表,如覆蓋索引;

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/260418.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/260418.shtml
英文地址,請注明出處:http://en.pswp.cn/news/260418.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python git是什么_python爬蟲之git的使用

一、簡單認識: 1、初始化文件夾為版本控制文件夾,首先建立一個文件夾,進入這個文件夾以后輸入git init初始化這個文件夾。2、Git幾種位置概念 1、本地代碼:本地更改完代碼以后,雖然是存放在git的文件夾里面&#xff0c…

產品經理網站數據分析之測量問題現狀(二)

本章續接上文,主要講解流程圖的繪制要領,以及示例。 1、基礎流程圖 基礎流程圖應該簡明扼要地描述出流程的主要結構,在弄清楚流程的起點、終點,以及主要步驟后,按照流程的先后順序,按照要展示的流程長短比例…

鍵盤流的逆襲- Idea 中使用 VIM mode 提高生成效率

Idea 中使用 VIM mode 提高生成效率 安裝配置 Idea 的 vim 插件 先挖坑,后續再填。這個毫無技術含量,不寫了,自己去搜吧。 快捷鍵代替鼠標 打開文件 按兩下 shift 鍵 > 輸入類目文件名按 command e ,打開最近編輯的文件列表&a…

git 撤銷掛起的更改_Timer計時任務因系統時間的修改導致掛起解決方案

之前開發的一款運行在定制Android設備上的一個實時監控程序發生了一個很奇怪的問題:關機狀態下放置了半個月左右的時間之后,再次開機使用,使用到一半的時候,顯示界面就卡死在某一個狀態下了(顯示界面只顯示一行文字,代…

yii urlmanager配置post不生效_一文帶你徹底學會 Git Hooks 配置

你好,我是小桔,是一個沒有感情的代碼崽。今天給大家介紹一下 Git Hooks,相信 Git 大家都在用吧,Git 除了用作版本控制,還有許多高級功能,Git Hooks 就是其中之一。本文環境:Git 版本&#xff1a…

Tiff – 值得你體驗一下的可視化的字體對比工具

Tiff 是一款字體對比工具,可視化對比兩種字體之間的差異。這是一個工具來幫助比較兩種字體,同時學習排版。在這一點上,谷歌 Web 字體作為 Tiff 外部字體文件的唯一來源。由于應用程序使用的一些功能需要 HTML5 和 CSS3 支持,因此請…

[.NET] 建構子中傳遞子對象的對象

在設計對象繼承的時候&#xff0c;父對象建構子會需要一些參數&#xff0c;這些參數可以由子對象建構子透過base關鍵詞來提供。 namespace Test001 {public class ParentClass{// Constructorspublic ParentClass(IEnumerable<string> dataCollection){this.DataCollecti…

php基礎教程(三):變量

1、php變量規則 變量以 $ 符號開頭&#xff0c;其后是變量的名稱變量名稱必須以字母或下劃線開頭變量名稱不能以數字開頭變量名稱只能包含字母數字字符和下劃線&#xff08;A-z、0-9 以及 _&#xff09;變量名稱對大小寫敏感&#xff08;$y 與 $Y 是兩個不同的變量&#xff09;…

操作系統實驗文件管理_系統設計硬核知識(5)——操作系統的文件管理

操作系統對計算機的管理包括兩個方面&#xff1a;硬件資源和軟件資源。硬件資源的管理包括CPU 的管理、存儲器的管理、設備管理等&#xff0c;主要解決硬件資源的有效和合理利用問題。軟件資源包括各種系統程序、各種應用程序、各種用戶程序&#xff0c;也包括大量的文檔材料、…

錯誤 0xc0202049: 數據流任務 1: 無法在只讀列“ID”中插入數據

數據庫導入導出時總失敗&#xff0c;錯誤信息如下&#xff1a; 正在驗證 (錯誤) 消息錯誤 0xc0202049: 數據流任務 1: 無法在只讀列“ID”中插入數據。 (SQL Server 導入和導出向導) 錯誤 0xc0202045: 數據流任務 1: 驗證列元數據失敗。 (SQL Server 導入和導出向導) 錯誤 0xc0…

python中的items方法_Python 字典的items()方法和iteritems()方法有什么不同?【面試題詳解】...

今天愛分享給大家帶來Python 字典的items()方法和iteritems()方法有什么不同?【面試題詳解】&#xff0c;希望能夠幫助到大家。 字典是 Python 語言中唯一的映射類型。映射類型對象里哈希鍵(鍵&#xff0c;key)和指向的對象&#xff08;值&#xff0c;value)是多對一的關系&am…

大網高級技術筆記(一)

防偽碼&#xff1b;黑發不知勤學早&#xff0c;白首方悔讀書遲本章目標&#xff1a;理解消化動態路由協議與OSPF協議并應用于實際工作中。第一章 動態路由協議一、按照路由執行的算法分類距離矢量路由協議&#xff1a;RIP、IGRP鏈路狀態路由協議&#xff1a;OSPE、IS-IS二、RIP…

容器類基礎篇(一)

容器類&#xff1a;用來解決數組具有固定尺寸而使得靈活性受限的問題。基本的容器類&#xff08;集合類&#xff09;有&#xff1a;List、Set、Queue、Map。 Java容器類類庫的用途是用來“保存對象”&#xff0c;這分為兩個不同的大類&#xff1a; 1.Collection&#xff08;集合…

阿里MySQL讀寫一致_阿里面試題:如何保證緩存與數據庫的雙寫一致性?

作者&#xff1a;你是我的海嘯出處&#xff1a;https://blog.csdn.net/chang384915878/article/details/86756463只要用緩存&#xff0c;就可能會涉及到緩存與數據庫雙存儲雙寫&#xff0c;你只要是雙寫&#xff0c;就一定會有數據一致性的問題&#xff0c;那么你如何解決一致性…

反射小應用之DataTable和ListT互操作

反射小應用之DataTable和List<T>互操作 在程序中&#xff0c;往往會遇到一些小情況&#xff0c;就是數據庫取出來的時候為了方便直接將數據通過存儲在DataSet或DataTable中&#xff0c;這樣做的一個后果是在日后的的對數據進行”細“操作時&#xff0c;就發現它可能沒有L…

python適合什么樣的人群_什么樣的人比較適合選擇Python開發+人工智能技術?

原標題&#xff1a;什么樣的人比較適合選擇Python開發人工智能技術&#xff1f; 互聯網行業最近幾年來確實成為了競相追捧的行業&#xff0c;人工智能、大數據的不斷發展讓Python開發技術成為了繼Java開發之后的又一熱門編程語言。我們都知道&#xff0c;想要學習Python開發編程…

java 8 方法引用(method references)

1 什么是方法引用&#xff08;method references&#xff09;java 8 添加了一個很熟悉但是又很陌生的符號::。 你也許會看到這樣的代碼System.out::println其實就是方法引用&#xff08;method references&#xff09;。由于java 8 把方法/函數也作為第一輸入參數。所以你會看到…

SWT中Button事件的幾種不同寫法

1&#xff0e;匿名內部類寫法button.addSelectionListener(new SelectionAdapter(){Overridepublic void widgetSelected(SelectionEvent e){.....}});釋&#xff1a;當button被單擊時&#xff0c;底層就會檢查button是否注冊了相對就的監聽器&#xff0c;如果有&#xff0c;底…

python中fetchall函數_python中查詢數據庫時fetchone()函數和fetchall()函數的區別

我們在用python操作數據庫的時候,經常會碰見兩個函數:fetchone()和fetchall()剛開始學習的時候可能會搞不清楚他們兩個的區別其實非常簡單首先fetchone()函數它的返回值是單個的元組,也就是一行記錄,如果沒有結果,那就會返回null其次是fetchall()函數,它的返回值是多個元組,即返…

文字對齊格式

text-align:justify; letter-spacing:5px; line-height:40px; text-indent:40px 轉載于:https://www.cnblogs.com/mrcln/p/3757148.html