system和sysaux表空間的回收
資料庫mysql
如果用檔案儲存資料存在幾個缺點:
(1)檔案的安全性問題
(2)檔案不利於查詢和對資料的管理
(3)檔案不利於存放海量資料
(4)檔案在程式中控制不方便
什麼是資料庫?
資料庫是“按照資料結構來組織、儲存和管理資料的倉庫”。是一個長期儲存在計算機內的、有組織的、可共享的、統一管理的大量資料的集合。
資料庫是以一定方式儲存在一起、能與多個使用者共享、具有儘可能小的冗餘度、與應用程式彼此獨立的資料集合,可視為電子化的檔案櫃——儲存電子檔案的處所,使用者可以對檔案中的資料進行新增、查詢、更新、刪除等操作。
資料庫的種類:
關係型資料庫:mysql,Oracle,SQL Server
MySQL的表型別由儲存引擎(Storage Engines)決定,型別包括MyISAM、innoDB、BDB等。
MySQL 資料表主要支援六種型別 ,分別是:BDB、HEAP、ISAM、MERGE、MYISAM、InnoBDB。(參考mysql文件.)
這六種又分為兩類,一類是”事務安全型”(transaction-safe),包括BDB和InnoDB;其餘都屬於第二類,稱為”非事務安全 型”(non-transaction-safe)。
下列是mysql的幾個儲存引擎,目前mysql預設的儲存引擎是innoDB。
表鎖:開銷小,加鎖快,不會出現死鎖,鎖定粒度大,發生鎖衝突概率高,併發度低
MyISAM不支援事務、也不支援外來鍵,但其訪問速度快,對事 務完整性沒有要求
② InnoDB儲存引擎提供了具有提交、回滾和崩潰恢復能力的事 務安全。但是比起MyISAM儲存引擎,InnoDB寫的處理效率差一些並且會佔用更多的磁碟空間以保留資料和索引。
MySQL 事務屬性
事務是由一組SQL語句組成的邏輯處理單元,事務具有ACID屬性。
原子性(Atomicity):事務是一個原子操作單元。在當時原子是不可分割的最小元素,其對資料的修改,要麼全部成功,要麼全部都不成功。
一致性(Consistent):事務開始到結束的時間段內,資料都必須保持一致狀態。
永續性(Durable):事務完成後,它對於資料的修改是永久性的,即使出現系統故障也能夠保持。
事務常見問題
更新丟失(Lost Update)
原因:當多個事務選擇同一行操作,並且都是基於最初選定的值,由於每個事務都不知道其他事務的存在,就會發生更新覆蓋的問題。類比github提交衝突。
髒讀(Dirty Reads)
原因:事務A讀取了事務B已經修改但尚未提交的資料。若事務B回滾資料,事務A的資料存在不一致性的問題。
不可重複讀(Non-Repeatable Reads)
原因:事務A第一次讀取最初資料,第二次讀取事務B已經提交的修改或刪除資料。導致兩次讀取資料不一致。不符合事務的隔離性。
幻讀(Phantom Reads)
原因:事務A根據相同條件第二次查詢到事務B提交的新增資料,兩次資料結果集不一致。不符合事務的隔離性。
幻讀和髒讀有點類似
髒讀是事務B裡面修改了資料,
幻讀是事務B裡面新增了資料。
事務的隔離級別
資料庫的事務隔離越嚴格,併發副作用越小,但付出的代價也就越大。這是因為事務隔離實質上是將事務在一定程度上"序列"進行,這顯然與"併發"是矛盾的。根據自己的業務邏輯,權衡能接受的最大副作用。從而平衡了"隔離" 和 "併發"的問題。MySQL預設隔離級別是可重複讀。
髒讀,不可重複讀,幻讀,其實都是資料庫讀一致性問題,必須由資料庫提供一定的事務隔離機制來解決。
優化
對於一個以資料為中心的應用,資料庫的好壞直接影響到程式的效能,因此資料庫效能至關重要。一般來說,要保證資料庫的效率,要做好以下四個方面的工作:
① 資料庫設計 ② sql語句優化 ③ 資料庫引數配置 ④ 恰當的硬體資源和作業系統
這個順序也表現了這四個工作對效能影響的大小
資料庫表設計
通俗地理解三個正規化,對於資料庫設計大有好處。在資料庫設計中,為了更好地應用三個正規化,就必須通俗地理解三個正規化(通俗地理解是夠用的理解,並不是最科學最準確的理解):
第一正規化:1NF是對屬性的原子性約束,要求屬性(列)具有原子性,不可再分解;(只要是關係型資料庫都滿足1NF)
第二正規化:2NF是對記錄的惟一性約束,要求記錄有惟一標識,即實體的惟一性;
第三正規化:3NF是對欄位冗餘性的約束,它要求欄位沒有冗餘。
沒有冗餘的資料庫設計可以做到。但是,沒有冗餘的資料庫未必是最好的資料庫,有時為了提高執行效率,就必須降低正規化標準,適當保留冗餘資料。具體做法是,在概念資料模型設計時遵守第三正規化,降低正規化標準的工作放到物理資料模型設計時考慮。降低正規化就是增加欄位,允許冗餘。
說起提高資料庫效能,索引是最物美價廉的東西了。不用加記憶體,不用改程式,不用調sql,只要執行個正確的’create
index’,查詢速度就可能提高百倍千倍,這可真有誘惑力。可是天下沒有免費的午餐,查詢速度的提高是以插入、更新、刪除的速度為代價的,這些寫操作,增加了大量的I/O。
索引的型別
主鍵索引,主鍵自動的為主索引 (型別Primary)
唯一索引 (UNIQUE) 普通索引
(INDEX) 索引的使用
查詢要使用索引最重要的條件是查詢條件中需要使用索引。
哪些列上適合新增索引
較頻繁的作為查詢條件欄位應該建立索引
select * from emp where empno = 1
唯一性太差的欄位不適合單獨建立索引,即使頻繁作為查詢條件
select * from emp where sex = '男‘
更新非常頻繁的欄位不適合建立索引
select * from emp where logincount = 1
不會出現在WHERE子句中欄位不該建立索
下列幾種情況下有可能使用到索引:
1,對於建立的多列索引,只要查詢條件使用了最左邊的列,索引一般就會被使用。
2,對於使用like的查詢,查詢如果是 ‘%aaa’不會使用到索引 ‘aaa%’ 會使用到索引。
下列的表將不使用索引:
1,如果條件中有or,即使其中有條件帶索引也不會使用。
2,對於多列索引,不是使用的第一部分,則不會使用索引。
3,like查詢是以%開頭
4,如果列型別是字串,那一定要在條件中將資料使用引號引用起來。否則不使用索引。(新增時,字串必須’’)
5,如果mysql估計使用全表掃描要比使用索引快,則不使用索引。
SQL語句優化
通過show status命令瞭解各種SQL的執行頻率。
定位執行效率較低的SQL語句-(重點select)
通過explain分析低效率的SQL語句的執行情況
確定問題並採取相應的優化措施
Explain select * from emp where ename=“zrlcHd”
會產生如下資訊:
select_type:表示查詢的型別。
table:輸出結果集的表
type:表示表的連線型別
possible_keys:表示查詢時,可能使用的索引
key:表示實際使用的索引
key_len:索引欄位的長度
rows:掃描出的行數(估算的行數)
Extra:執行情況的描述和說明
常見的sql優化
對於Innodb:
1,將要匯入的資料按照主鍵排序
2,set unique_checks=0,關閉唯一性校驗。
3,set autocommit=0,關閉自動提交。
優化group by 語句
預設情況,MySQL對所有的group by col1,col2進行排序。這與在查詢中指定order by col1, col2類似。如果查詢中包括group by但使用者想要避免排序結果的消耗,則可以使用order by null禁止排序
選擇適合的資料型別
在精度要求高的應用中,建議使用定點數來儲存數值,以保證結果的準確性。deciaml 不要用float
對於儲存引擎是MyISAM的資料庫,如果經常做刪除和修改記錄的操作,要定時執行optimize tabletable_name;功能對錶進行碎片整理。 日期型別要根據實際需要選擇能夠滿足應用的最小儲存的早期型別
對錶進行水平劃分
對錶進行垂直劃分
大一點的圖片和視訊
資料庫只儲存路徑。圖片和檔案存放在檔案系統,甚至單獨放在一臺伺服器(圖床 / 視訊伺服器 ).
合理的硬體資源和作業系統
讀寫分離,根據自己的裝置大小合理設計引擎引數