天天看點

MySQL性能管理及架構設計(二):資料庫結構優化、高可用架構設計、資料庫索引優化(收藏一波)

MySQL性能管理及架構設計(一):什麼影響了資料庫查詢速度、什麼影響了MySQL性能

一、資料庫結構優化(非常重要)

1.1 資料庫結構優化目的

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

2、盡量避免資料維護中出現更新,插入和删除異常:

MySQL性能管理及架構設計(二):資料庫結構優化、高可用架構設計、資料庫索引優化(收藏一波)

總結:要避免異常,需要對資料庫結構進行範式化設計。

3、節約資料存儲空間。

4、提高查詢效率。

10年架構師領你架構-成長之路-(附面試題(含答案))

(騰訊T3-T4)打造網際網路PHP架構師教程目錄大全,隻要你看完,薪資立馬提升2倍(持續更新)

點選與我交流企鵝群.

1.2 資料庫結構設計步驟

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

2、邏輯設計(重要):設計資料的邏輯存儲結構。資料實體之間的邏輯關系,解決資料備援和資料維護異常。資料範式可以幫助我們設計;

3、實體設計:表結構設計,存儲引擎與列的資料類型;

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

1.3 資料庫範式設計與反範式化

傳送門:資料庫邏輯設計之三大範式通俗了解,一看就懂,書上說的太晦澀

1.4 實體設計

MySQL性能管理及架構設計(二):資料庫結構優化、高可用架構設計、資料庫索引優化(收藏一波)
MySQL性能管理及架構設計(二):資料庫結構優化、高可用架構設計、資料庫索引優化(收藏一波)
MySQL性能管理及架構設計(二):資料庫結構優化、高可用架構設計、資料庫索引優化(收藏一波)

f="https://zhuanlan.zhihu.com/p/259786270">相關傳送門:MySQL中字段類型與合理的選擇字段類型;int(11)最大長度是多少?,varchar最大長度是多少

二、高可用架構設計

MySQL性能管理及架構設計(二):資料庫結構優化、高可用架構設計、資料庫索引優化(收藏一波)
MySQL性能管理及架構設計(二):資料庫結構優化、高可用架構設計、資料庫索引優化(收藏一波)

2.1 讀寫分離

MySQL性能管理及架構設計(二):資料庫結構優化、高可用架構設計、資料庫索引優化(收藏一波)

MaxScale:實作MySQL讀寫分離與負載均衡的中間件利器

三、資料庫索引優化(非常重要)

3.1 兩種主要資料結構:B-tree和Hash

3.1.1 B-tree結構

MySQL性能管理及架構設計(二):資料庫結構優化、高可用架構設計、資料庫索引優化(收藏一波)

B-tree索引的限制:

MySQL性能管理及架構設計(二):資料庫結構優化、高可用架構設計、資料庫索引優化(收藏一波)

3.1.2 Hash結構

MySQL性能管理及架構設計(二):資料庫結構優化、高可用架構設計、資料庫索引優化(收藏一波)

感謝大家一直來支援,這是我準備的1000粉絲福利

【1000粉絲福利】10年架構師分享PHP進階架構資料,助力大家都能30K

點選與我交流企鵝群.

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` )
           
  1. 普通索引:最基本的索引,沒有任何限制
  2. 唯一索引:與"普通索引"類似,不同的就是:索引列的值必須唯一,但允許有空值。
  3. 主鍵索引:它 是一種特殊的唯一索引,不允許有空值。
  4. 全文索引:僅可用于 MyISAM 表,針對較大的資料,生成全文索引很耗時好空間。
  5. 組合索引:為了更多的提高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 索引列上不能使用表達式和函數

MySQL性能管理及架構設計(二):資料庫結構優化、高可用架構設計、資料庫索引優化(收藏一波)

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))

MySQL性能管理及架構設計(二):資料庫結構優化、高可用架構設計、資料庫索引優化(收藏一波)

如何選擇索引列的順序:

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

2、選擇性高的列優先;

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

大廠2000道面試題(含答案)

PHP面試題彙總,看完這些面試題助力你面試成功,工資必有20-25K

點選與我交流企鵝群.

3.3.3 組合/聯合索引政策

如果索引了多列,要遵守最左字首法則。指的是查詢從索引的最左前列開始并且不跳過索引中的列。 "http://www.uml.org.cn/sjjm/201107145.asp#nav-4-2">深入了解請移步:最左字首原理與相關優化

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所限制);

mysql高效索引之覆寫索引

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

全值比對我最愛,最左字首要遵守; 帶頭大哥不能死,中間兄弟不能斷; 索引列上不計算,範圍之後全失效; LIKE百分寫最右,覆寫索引不寫 *; 不等空值還有or,索引失效要少用; 字元單引不可丢,SQL進階也不難 ;

MySQL進階-索引優化

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 删除重複索引

MySQL性能管理及架構設計(二):資料庫結構優化、高可用架構設計、資料庫索引優化(收藏一波)

注:主鍵限制相當于(唯一限制 + 非空限制)

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

3.5.2 删除備援索引

MySQL性能管理及架構設計(二):資料庫結構優化、高可用架構設計、資料庫索引優化(收藏一波)

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

喜歡我的文章就關注我吧,持續更新中.....

以上内容希望幫助到大家,很多PHPer在進階的時候總會遇到一些問題和瓶頸,業務代碼寫多了沒有方向感,不知道該從那裡入手去提升,對此我整理了一些資料,包括但不限于:分布式架構、高可擴充、高性能、高并發、伺服器性能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點進階進階幹貨需要的可以免費分享給大家,需要的可以點選進入暗号:知乎。