《Mysql必讀詳解MySQL性能優化(二)》要點:
本文介紹了Mysql必讀詳解MySQL性能優化(二),希望對您有用。如果有疑問,可以聯系我們。
MYSQL數據庫接著上一篇學習:/article/70528.htm
MYSQL數據庫七、MySQL數據庫Schema設計的性能優化
高效的模型設計
MYSQL數據庫適度冗余-讓Query盡兩減少Join
MYSQL數據庫大字段垂直分拆-summary表優化
MYSQL數據庫大表水平分拆-基于類型的分拆優化
MYSQL數據庫統計表-準實時優化
MYSQL數據庫合適的數據類型
MYSQL數據庫
MYSQL數據庫時間存儲格式總類并不是太多,我們常用的主要就是DATETIME,DATE和TIMESTAMP這三種了.從存儲空間來看TIMESTAMP最少,四個字節,而其他兩種數據類型都是八個字節,多了一倍.而TIMESTAMP的缺點在于他只能存儲從1970年之后的時間,而另外兩種時間類型可以存放最早從1001年開始的時間.如果有需要存放早于1970年之前的時間的需求,我們必需放棄TIMESTAMP類型,但是只要我們不需要使用1970年之前的時間,最好盡量使用TIMESTAMP來減少存儲空間的占用.
MYSQL數據庫字符存儲類型
MYSQL數據庫
MYSQL數據庫CHAR[(M)]類型屬于靜態長度類型,存放長度完全以字符數來計算,所以最終的存儲長度是基于字符集的,如latin1則最大存儲長度為255字節,但是如果使用gbk則最大存儲長度為510字節.CHAR類型的存儲特點是不管我們實際存放多長數據,在數據庫中都會存放M個字符,不夠的通過空格補上,M默認為1.雖然CHAR會通過空格補齊存放的空間,但是在拜訪數據的時候,MySQL會忽略最后的所有空格,所以如果我們的實際數據中如果在最后確實需要空格,則不能使用CHAR類型來存放.
MYSQL數據庫VARCHAR[(M)]屬于動態存儲長度類型,僅存占用實際存儲數據的長度.TINYTEXT,TEXT,MEDIUMTEXT和LONGTEXT這四種類型同屬于一種存儲方式,都是動態存儲長度類型,不同的僅僅是最大長度的限制.
MYSQL數據庫事務優化
MYSQL數據庫1. 臟讀:臟讀就是指當一個事務正在拜訪數據,并且對數據進行了修改,而這種修改還沒有提交到數據庫中,這時,另外一個事務也拜訪這個數據,然后使用了這個數據.
MYSQL數據庫2. 不可重復讀:是指在一個事務內,多次讀同一數據.在這個事務還沒有結束時,另外一個事務也拜訪該同一數據.那么,在第一個事務中的兩次讀數據之間,由于第二個事務的修改,那么第一個事務兩次讀到的的數據可能是不一樣的.這樣就發生了在一個事務內兩次讀到的數據是不一樣的,因此稱為是不可重復讀.
MYSQL數據庫3. 幻讀:是指當事務不是獨立執行時發生的一種現象,例如第一個事務對一個表中的數據進行了修改,這種修改涉及到表中的全部數據行.同時,第二個事務也修改這個表中的數據,這種修改是向表中插入一行新數據.那么,以后就會發生操作第一個事務的用戶發現表中還有沒有修改的數據行,就好象發生了幻覺一樣.
MYSQL數據庫Innodb在事務隔離級別方面支持的信息如下:
MYSQL數據庫1.READ UNCOMMITTED
MYSQL數據庫常被成為Dirty Reads(臟讀),可以說是事務上的最低隔離級別:在普通的非鎖定模式下SELECT的執行使我們看到的數據可能并不是查詢發起時間點的數據,因而在這個隔離度下是非Consistent Reads(一致性讀);
MYSQL數據庫2.READ COMMITTED
MYSQL數據庫這一隔離級別下,不會出現DirtyRead,但是可能出現Non-RepeatableReads(不可重復讀)和PhantomReads(幻讀).
MYSQL數據庫3. REPEATABLE READ
MYSQL數據庫REPEATABLE READ隔離級別是InnoDB默認的事務隔離級.在REPEATABLE READ隔離級別下,不會出現DirtyReads,也不會出現Non-Repeatable Read,但是仍然存在PhantomReads的可能性.
MYSQL數據庫4.SERIALIZABLE
MYSQL數據庫SERIALIZABLE隔離級別是標準事務隔離級別中的最高級別.設置為SERIALIZABLE隔離級別之后,在事務中的任何時候所看到的數據都是事務啟動時刻的狀態,不論在這期間有沒有其他事務已經修改了某些數據并提交.所以,SERIALIZABLE事務隔離級別下,PhantomReads也不會出現.
MYSQL數據庫八、可擴展性設計之數據切分
MYSQL數據庫數據的垂直切分
MYSQL數據庫數據的垂直切分,也可以稱之為縱向切分.將數據庫想象成為由很多個一大塊一大塊的“數據塊”(表)組成,我們垂直的將這些“數據塊”切開,然后將他們分散到多臺數據庫主機上面.這樣的切分辦法就是一個垂直(縱向)的數據切分.
MYSQL數據庫垂直切分的優點
MYSQL數據庫◆數據庫的拆分簡單明了,拆分規則明確;
MYSQL數據庫◆應用程序模塊清晰明確,整合容易;
MYSQL數據庫◆數據維護便利易行,容易定位;
MYSQL數據庫垂直切分的缺點
MYSQL數據庫◆部分表關聯無法在數據庫級別完成,必要在程序中完成;
MYSQL數據庫◆對于拜訪極其頻繁且數據量超大的表仍然存在性能平靜,不一定能滿足要求;
MYSQL數據庫◆事務處理相對更為復雜;
MYSQL數據庫◆切分達到必定程度之后,擴展性會遇到限制;
MYSQL數據庫◆過讀切分可能會帶來系統過渡復雜而難以維護.
MYSQL數據庫數據的水平切分
MYSQL數據庫數據的垂直切分基本上可以簡單的理解為依照表依照模塊來切分數據,而水平切分就不再是依照表或者是功能模塊來切分了.一般來說,簡單的水平切分主要是將某個訪問極其平凡的表再依照某個字段的某種規則來分散到多個表之中,每個表中包含一部分數據.
MYSQL數據庫水平切分的優點
MYSQL數據庫◆表關聯基本能夠在數據庫端全部完成;
MYSQL數據庫◆不會存在某些超大型數據量和高負載的表遇到瓶頸的問題;
MYSQL數據庫◆應用程序端整體架構改動相對較少;
MYSQL數據庫◆事務處理相對簡單;
MYSQL數據庫◆只要切分規則能夠定義好,基本上較難遇到擴展性限制;
MYSQL數據庫水平切分的缺點
MYSQL數據庫◆切分規則相對更為復雜,很難抽象出一個能夠滿足整個數據庫的切分規則;
MYSQL數據庫◆后期數據的維護難度有所增加,人為手工定位數據更困難;
MYSQL數據庫◆應用系統各模塊耦合度較高,可能會對后面數據的遷移拆分造成必定的困難.
MYSQL數據庫數據切分與整合中可能存在的問題
MYSQL數據庫1.引入分布式事務的問題
MYSQL數據庫完全可以將一個跨多個數據庫的分布式事務分拆成多個僅處于單個數據庫上面的小事務,并通過應用程序來總控各個小事務.當然,這樣作的要求就是我們的俄應用程序必需要有足夠的健壯性,當然也會給應用程序帶來一些技術難度.
MYSQL數據庫2.跨節點Join的問題
MYSQL數據庫保舉通過應用程序來進行處理,先在驅動表所在的MySQLServer中取出相應的驅動結果集,然后根據驅動結果集再到被驅動表所在的MySQL Server中取出相應的數據.
MYSQL數據庫3.跨節點合并排序分頁問題
MYSQL數據庫從多個數據源并行的取數據,然后應用程序匯總處理.
MYSQL數據庫九、可擴展性設計之Cache與Search的利用
MYSQL數據庫通過引入Cache(Redis、Memcached),減少數據庫的拜訪,增加性能.
MYSQL數據庫通過引入Search(Lucene、Solr、ElasticSearch),利用搜索引擎高效的全文索引和分詞算法,以及高效的數據檢索實現,來辦理數據庫和傳統的Cache軟件完全無法辦理的全文模糊搜索、分類統計查詢等功能.
MYSQL數據庫
MYSQL數據庫以上便是本文的全部內容,希望大家可以喜歡.
歡迎參與《Mysql必讀詳解MySQL性能優化(二)》討論,分享您的想法,維易PHP學院為您提供專業教程。