日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

作為程序員,我們在項目中會使用到許多種類的數(shù)據(jù)庫,根據(jù)業(yè)務(wù)類型、并發(fā)量和數(shù)據(jù)要求等選擇不同類型的數(shù)據(jù)庫,比如MySQL、Oracle、SQLServer、SQLite、MongoDB和redis等。今天我們就來系統(tǒng)的介紹一下這其中的關(guān)系型數(shù)據(jù)庫MySQL,這也是在很多開源系統(tǒng)中使用比較多的,因為其體積小、速度快、并且開源等的特征吸引很多開發(fā)人員的青睞。不管是自用還是商用,一些業(yè)務(wù)不太復(fù)雜的系統(tǒng)使用MySQL都是一個不錯的選擇。


 

接下來我們主要通過編寫SQL語句的方式來講解SQL的一些知識點,首先我們創(chuàng)建兩張表,用戶表(user)和崗位表(post),設(shè)計幾個簡單的字段,后續(xù)的SQL語句都是基于這兩張表。以下是這兩張表的結(jié)構(gòu)。


 

1、基礎(chǔ)概念

我們先來了解一些MySQL中常涉及的一些基礎(chǔ)概念。

1.1、MySQL存儲引擎

1.1.1、什么是存儲引擎

MySQL中的數(shù)據(jù)是用各種不同的技術(shù)存儲在文件中,每一種技術(shù)都使用不同的存儲機制、索引技巧、鎖定水平并最終提供不同的功能和能力,這些不同的技術(shù)以及配套的功能在MySQL中稱為存儲引擎。存儲引擎是MySQL將數(shù)據(jù)存儲在文件系統(tǒng)中的存儲方式或者存儲格式。

1.1.2、MySQL有哪些存儲引擎

MySQL的存儲引擎包括: InnoDB 、MyISAM 、BDB、MEMORY、MERGE、EXAMPLE、NDB Cluster、ARCHIVE、CSV、BLACKHOLE 和 FEDERATED等。其中 MylSAM 和 lnnoDB 是比較常用的兩種。

MyISAM的主要特點是擁有較高的插入,查詢速度,但不支持事務(wù),支持表鎖(即使操作一條記錄也會鎖住整個表,不適合高并發(fā)的操作);而InnoDB引擎提供對數(shù)據(jù)庫事務(wù)的支持,并且還提供了行級鎖和外鍵的約束(操作時只鎖某一行,不對其它行有影響,適合高并發(fā)的操作),InnoDB也是MySQL5.5版本后默認數(shù)據(jù)庫存儲引擎。

我們用一張圖來對比一下兩者的區(qū)別。


 

1.1.3、怎么查詢當(dāng)前數(shù)據(jù)的存儲引擎

可以使用數(shù)據(jù)庫管理工具客戶端查看(表類型會顯示),也可以使用查詢語句進行查詢。使用 show engines 查詢當(dāng)前數(shù)據(jù)庫支持的存儲引擎,使用 show variables like '%storage_engine%' 查詢l數(shù)據(jù)庫默認的存儲引擎。前面也說到了,MySQL5.5之前的默認存儲引擎是MyISAM,MySQL5.5版本后默認數(shù)據(jù)庫存儲引擎改為了InnoDB【我們可以通過select version() 查詢mysql的版本】


 

1.2、MySQL事務(wù)

1.2.1、什么是事務(wù)?

事務(wù)就是一組獨立不可分割的工作單元,事務(wù)中的操作要么全部執(zhí)行成功,要么全部執(zhí)行失敗,沒有其他的中間狀態(tài)。具體地說,就是在一個事務(wù)中執(zhí)行多個操作時,要么所有的事務(wù)都被提交(commit),那么這些修改就永久保存下來;要么數(shù)據(jù)庫放棄所做的所有修改,整個事務(wù)回滾(rollback)到最初狀態(tài)。

1.2.2、事務(wù)的四大特性

事務(wù)的四個特性分別是:原子性、一致性、隔離性和持久性,即所謂的ACID。

 

  • 原子性:將事務(wù)看作是不可再分的原子,一旦開始事務(wù),要么全部執(zhí)行,要么全部取消,是不存在中間狀態(tài)的。即把一個事務(wù)看成一個整體,牽一發(fā)而動全身。
  • 一致性:在事務(wù)開始之前和之后,數(shù)據(jù)從一個合法性狀態(tài)變換到另一個合法性狀態(tài),數(shù)據(jù)庫的完整性約束沒有被破壞。例如買早餐,顧客付了10塊錢。老板收到了10塊錢(這里不考慮手續(xù)費的問題),顧客和老板加起來的總額不會變化,不多也不少。
  • 隔離性:每個讀寫事務(wù)對其他事務(wù)的操作對象能相互分離。例如事務(wù)T1和事務(wù)T2的操作不能相互干擾。
  • 持久性:事務(wù)一旦提交,它對數(shù)據(jù)庫中數(shù)據(jù)的改變就是永久性,接下來的其他操作和數(shù)據(jù)庫故障不應(yīng)該對其有任何影響。持久性是通過事務(wù)日志來保證的。日志包括了重做日志和回滾日志。

 

1.2.3、事務(wù)的實現(xiàn)

在介紹存儲引擎的時候,也說到了InnoDB是支持事務(wù)的,那么接下來我們就以InnoDB為例來說明。

數(shù)據(jù)庫通常借助日志來實現(xiàn)事務(wù),常見的有undo log 和 redo log,這兩種都能保證事務(wù)特性,undo log實現(xiàn)事務(wù)的原子性,redo log實現(xiàn)事務(wù)的持久性。

1.2.3.1、redo log(重做日志)

每當(dāng)操作時,在磁盤數(shù)據(jù)變更之前,將操作寫入redo log,這樣當(dāng)系統(tǒng)崩潰重啟后可以繼續(xù)執(zhí)行。

(1)redolog的作用

MySQL在innodb引擎下,所做的增刪改查都是先去buffer pool緩沖池(內(nèi)存區(qū)域)里面操作,然后再把數(shù)據(jù)寫入磁盤,因為增刪改都是在內(nèi)存操作,這樣就存在系統(tǒng)異常導(dǎo)致數(shù)據(jù)丟失的情況,redolog就是為了解決系統(tǒng)異常導(dǎo)致內(nèi)存修改丟失的問題。

(2)redolog如何保證數(shù)據(jù)不丟失

所有的操作都是以事務(wù)為單位的,在事務(wù)未執(zhí)行完畢的時候數(shù)據(jù)庫異常導(dǎo)致數(shù)據(jù)丟失是正常的,因為事務(wù)未提交成功。在事務(wù)提交的時候,我們把redolog從內(nèi)存刷入到磁盤中去,從而保證修改不丟失,如果寫入磁盤失敗,那事務(wù)也將提交失敗。

(3)為什么不直接把修改更新到磁盤?

MySQL操作數(shù)據(jù)是在內(nèi)存中完成的,然后再把內(nèi)存中的數(shù)據(jù)頁寫入到磁盤中。不直接操作磁盤目的就是為了提高性能。雖然redolog落盤的時候也是入磁盤,但它是順序?qū)懭耄苯訉Υ疟P上數(shù)據(jù)修改是隨機寫入,順序?qū)懙乃俣纫h遠快于隨機寫。

1.2.3.2、undo log(回滾日志)

當(dāng)一個事務(wù)執(zhí)行一半無法繼續(xù)執(zhí)行時,可以根據(jù)回滾日志將之前的修改恢復(fù)到變更之前的狀態(tài)。undo log 是 innodb 實現(xiàn),總的來說提供兩個作用:回滾和多版本控制(MVCC)。是事務(wù)特性的重要組成部分,在數(shù)據(jù)發(fā)生更新操作時(INSERT、DELETE、UPDATE)會產(chǎn)生 undo 記錄。先于 redo log 被記錄。

(1)提供回滾操作

我們在進行數(shù)據(jù)更新操作的時候,不僅會記錄redo log,還會記錄undo log,如果因為某些原因?qū)е率聞?wù)回滾,那么這個時候MySQL就要執(zhí)行回滾(rollback)操作,利用undo log將數(shù)據(jù)恢復(fù)到事務(wù)開始之前的狀態(tài)。如我們執(zhí)行下面兩條SQL語句(一條更新、一條刪除):


 

此時undo log會記錄兩條對應(yīng)的SQL語句,update對應(yīng)的是更新之前的數(shù)據(jù),delete對應(yīng)的是insert 語句【反向操作的語句】。在操作出現(xiàn)異常時,可以使用undo log日志來實現(xiàn)回滾操作,將數(shù)據(jù)還原回去,以保證事務(wù)的一致性。


 

我們來看一下執(zhí)行的過程(以第一條更新語句為例):

第一步:從磁盤讀取到user_id=1的記錄,放到內(nèi)存

第二步:記錄undo log 日志

第三步:記錄redo log (預(yù)提交狀態(tài))

第四步:修改內(nèi)存中user_id=1的記錄

第五步:記錄binlog,記錄完整SQL

第六步:提交事務(wù),寫入redo log (commit狀態(tài))


 

我們根據(jù)上面的流程來看,如果在上面的某一個階段數(shù)據(jù)庫崩潰,如何恢復(fù)數(shù)據(jù)。

在第一二三步執(zhí)行時數(shù)據(jù)庫崩潰:此時數(shù)據(jù)還沒有發(fā)生任何變化,故沒有任何影響,不需要做任何操作。

第四步修改內(nèi)存中的記錄時數(shù)據(jù)庫崩潰:此時事務(wù)沒有commit,所以這里要進行數(shù)據(jù)回滾,此時通過undo log進行數(shù)據(jù)回滾。

第五步寫入binlog時數(shù)據(jù)庫崩潰:這里和第四步一樣的邏輯,此時事務(wù)沒有commit,所以這里要進行數(shù)據(jù)回滾,會通過undo log進行數(shù)據(jù)回滾。

第六步事務(wù)提交時數(shù)據(jù)庫崩潰:如果數(shù)據(jù)庫在這個階段崩潰,那其實事務(wù)還是沒有提交成功,但是這里并不能像之前一樣對數(shù)據(jù)進行回滾,因為在提交事務(wù)前 binlog可能成功寫入磁盤了,所以這里要根據(jù)兩種情況來做決定。如果binlog存在事務(wù)記錄:那么就"認為"事務(wù)已經(jīng)提交了,這里可以根據(jù)redo log對數(shù)據(jù)進行重做;如果binlog不存在事務(wù)記錄,那么這種情況事務(wù)還未提交成功,所以會對數(shù)據(jù)進行回滾。

(2)提供多版本控制(MVCC)【undo log實現(xiàn)多版本并發(fā)控制(MVCC)】

MVCC,即多版本控制。在MySQL數(shù)據(jù)庫InnoDB存儲引擎中,用undo Log來實現(xiàn)多版本并發(fā)控制(MVCC)。當(dāng)讀取的某一行被其他事務(wù)鎖定時,它可以從undo log中分析出該行記錄以前的數(shù)據(jù)版本是怎樣的,從而讓用戶能夠讀取到當(dāng)前事務(wù)操作之前的數(shù)據(jù)【快照讀】。

1.3、MySQL索引

1.3.1、什么是索引

在關(guān)系數(shù)據(jù)庫中,索引是一種單獨的、物理的對數(shù)據(jù)庫表中一列或多列的值進行排序的一種存儲結(jié)構(gòu),它是某個表中一列或若干列值的集合和相應(yīng)的指向表中物理標(biāo)識這些值的數(shù)據(jù)頁的邏輯指針清單。索引的作用相當(dāng)于圖書的目錄,可以根據(jù)目錄中的頁碼快速找到所需的內(nèi)容。

如果數(shù)據(jù)庫中沒有索引,此時查找的時候就需要把整個表遍歷一遍。比如如果想找id為1的圖書信息,沒有索引的查找過程就相當(dāng)于一個"順序表查找",數(shù)據(jù)量少的時候查詢效率差異倒不是很明顯,一旦數(shù)據(jù)量比較大,達到千萬億級別的時候,查詢就會特別的慢。而如果加了索引,查詢效率可以提升幾倍設(shè)置成百上千倍,當(dāng)然這也不是完全絕對的,還取決于開發(fā)人員編寫的SQL語句性能。

1.3.2、MySQL有哪些索引類型

(1)普通索引【INDEX】

普通索引是最基本的索引,它沒有任何限制,一張表可以創(chuàng)建多個普通索引,一個普通索引可以包含多個字段,允許數(shù)據(jù)重復(fù),允許 NULL 值插入。普通索引僅加速查詢。

(2)唯一索引【UNIQUE INDEX】和主鍵索引【PRIMARY KEY】

唯一索引與普通索引類似,不同的就是:索引列的值必須唯一,這里要注意的是,索引值是否允許為空,要分情況說明,多數(shù)可允許有空值,但主鍵索引是一類特殊的唯一索引,不可為空。如果是組合索引,則列值的組合必須唯一。簡單來說:唯一索引是加速查詢 + 列值唯一。

(3)組合索引

組合索引(也叫復(fù)合索引或者聯(lián)合索引),即一個索引包含多個列。組合索引指在多個字段上創(chuàng)建的索引,只有在查詢條件中使用了創(chuàng)建索引時的第一個字段,索引才會被使用。使用組合索引時遵循最左前綴集合。可以說:組合索引是多列值組成的一個索引,專門用于組合搜索,其效率大于索引合并。

嚴格來說,組合索引不算是單獨的一類,因為組合索引也可以是普通索引或者唯一索引,只要索引建立在多列上,普通索引和唯一索引都是可以在多列上建立組合索引的。

(4)全文索引【FULLTEXT】

全文索引主要用來查找文本中的關(guān)鍵字,而不是直接與索引中的值相比較。fulltext索引跟其他索引大不相同,它更像是一個搜索引擎,而不是簡單的where語句的參數(shù)匹配。fulltext索引配合match against操作使用,而不是一般的where語句加like。它可以在create table,alter table ,create index使用,不過目前只有char、varchar、text 列上可以創(chuàng)建全文索引。值得一提的是,在數(shù)據(jù)量較大的時候,先將數(shù)據(jù)放入一個沒有全局索引的表中,然后再用CREATE index創(chuàng)建fulltext索引,要比先為一張表建立fulltext然后再將數(shù)據(jù)寫入的速度快很多。


 

1.3.3、MySQL如何分析索引是否生效

最簡單的方式就是通過客戶端連接管理工具,使用它的解釋功能,查看possible_keys 字段值。


 

或者直接在查詢語句前面添加關(guān)鍵詞explain,對于explain查詢出來的結(jié)果,還是看possible_keys 用到的索引是不是查詢字段的索引。


 

1.3.4、MySQL索引為什么加快數(shù)據(jù)的檢索速度

很多人知道使用索引可以提高查詢效率,但是可能不太了解為什么可以加快數(shù)據(jù)的檢索速度。MySQL索引默認使用的數(shù)據(jù)結(jié)構(gòu)是B+樹,B+樹可以理解是扁且寬的(矮胖)。也就是層數(shù)少,每層的節(jié)點數(shù)目很多。但是每層的節(jié)點多歸多,卻不存儲數(shù)據(jù),只起到索引效果,所有的數(shù)據(jù)都存在葉子節(jié)點上。MySQL的數(shù)據(jù)是直接存儲在磁盤上的,而對于從磁盤查找數(shù)據(jù)來說,需要經(jīng)歷尋道、尋址、數(shù)據(jù)傳輸三個階段,使用B+樹,層數(shù)少,只在葉子節(jié)點存數(shù)據(jù)的特點就能極大的保證磁盤IO次數(shù)少,從而效率高。

有一些人可能會有疑問,為什么設(shè)計的是B+樹,而不是B樹或者哈希表?我們舉一個例子說明,在需要根據(jù)范圍查詢時,比如我需要查詢某一段時間內(nèi)的數(shù)據(jù),使用B樹和哈希表在實現(xiàn)范圍查詢時效率都比較低。B+樹的葉子節(jié)點使用了指針順序(鏈表)從小到大地連接在一起,B+樹葉節(jié)點兩兩相連可大大增加區(qū)間訪問性,只要遍歷葉子節(jié)點就可以實現(xiàn)整棵樹的遍歷,而B樹的葉子節(jié)點是相互獨立的,每個節(jié)點 key(索引)和 data 在一起,則無法查找區(qū)間;再說哈希表,哈希表是一種以key-value存儲數(shù)據(jù)的結(jié)構(gòu),所以多個數(shù)據(jù)在存儲關(guān)系上是完全沒有任何順序關(guān)系的,所以,對于區(qū)間查詢是無法直接通過索引查詢的,就需要全表掃描。

雖然索引有它的優(yōu)勢,但不是創(chuàng)建的越多越好,比如我們就不適合把每一列字段都建立索引,創(chuàng)建索引和維護索引要耗費時間,這種時間隨著數(shù)據(jù)量的增加而增加。另外索引需要占用物理空間,除了數(shù)據(jù)表占數(shù)據(jù)空間之外,每一個索引還要占一定的物理空間。


 

1.4、MySQL存儲過程和函數(shù)

1.4.1、什么是存儲過程和函數(shù)

存儲過程和函數(shù)是事先經(jīng)過編譯并存儲在數(shù)據(jù)庫中的一段SQL語句的集合,調(diào)用存儲過程和函數(shù)可以簡化開發(fā),減少數(shù)據(jù)在數(shù)據(jù)庫和應(yīng)用服務(wù)器之間的傳輸,可以提高數(shù)據(jù)處理效率。

1.4.2、存儲過程和函數(shù)的區(qū)別

存儲過程和函數(shù)的區(qū)別在于函數(shù)必須有返回值,而存儲過程沒有;存儲過程的參數(shù)可以使用IN、OUT、INPUT類型,而函數(shù)的參數(shù)只有IN類型。如果有函數(shù)從其他類型的數(shù)據(jù)庫遷移到MySQL,那么就可能需要將函數(shù)改造成存儲過程。

1.4.3、為什么使用存儲過程和函數(shù)

在完成一個邏輯操作時,有時會執(zhí)行多條SQL語句,此外這些SQL語句的執(zhí)行順序也不是固定的,它會根據(jù)條件的變化而變化。在執(zhí)行過程中,這些需要根據(jù)前面SQL語句的執(zhí)行結(jié)果有選擇的執(zhí)行后面的SQL語句。為了解決該問題,MySQL軟件提供了數(shù)據(jù)庫對象存儲過程和函數(shù)。

我們使用存儲過程,往往是一些比較復(fù)雜的業(yè)務(wù),并且把業(yè)務(wù)使用存儲過程來實現(xiàn),也方便后期的維護。

1.4.4、如何編寫存儲過程

(1)創(chuàng)建存儲過程

基本語法:

 

create procedure sp_name()
begin
.........
end

 

(2)調(diào)用存儲過程:

基本語法:call sp_name()

注意:存儲過程名稱后面必須加括號,哪怕該存儲過程沒有參數(shù)傳遞

(3)刪除存儲過程

基本語法:drop procedure sp_name

注意事項:不能在一個存儲過程中刪除另一個存儲過程,只能調(diào)用另一個存儲過程

(4)顯示所有存儲過程基本信息

基本語法:show procedure status

該語句會顯示數(shù)據(jù)庫中所有存儲的存儲過程基本信息,包括所屬數(shù)據(jù)庫,存儲過程名稱,創(chuàng)建時間等。

(5)顯示某一個mysql存儲過程的詳細信息

基本語法:show create procedure sp_name

我們來看一個示例:


 

1.4.5、項目中如何調(diào)用存儲過程

我們以dao層和MyBatis中XML交互為例(其他層如controller和service跟正常的業(yè)務(wù)沒有任何差異)。

dao層可以傳map作為 in 的請求參數(shù):void call_myp2(Map map);

mybatis中編寫xml語句調(diào)用存儲過程,入?yún)⑹褂胕n,出參使用out。


 

1.5、MySQL字符編碼
這里把字符編碼單獨拿出來講解,也是因為曾經(jīng)踩過坑,所以拿出來說明避免更多的人入坑。我們常用的字符集是latin1、gbk/gb2312、utf8/utf8mb4。

為了避免亂碼問題,我們一般會選用utf8/utf8mb4,而這兩者一般情況下都是沒有差異的,都能正常使用。但小編遇到一個問題,使用utf8mb4可以但utf8不行,就是存儲含有表情包(如火星文,moji表情等)的昵稱時,使用utf8會拋出異常,表情包被識別為xF0x9Fx8Dx89Ch。


 

后面分析得知,moji表情是字符,不是圖片,屬于unicode,發(fā)生上面的異常也是數(shù)據(jù)庫根本不認識'xF0x9Fx8Dx89Ch...',在字符集中沒有匹配到,導(dǎo)致'xF0x9Fx8Dx89Ch...'直接入庫,發(fā)生異常。

所以我們要配置一個合適的字符集,使數(shù)據(jù)庫支持這個字符,我們從字符的長度來進行分析,UTF8使用可變長度字節(jié)來存儲 Unicode字符,目前可見字符集都只需要3個字節(jié),包含了所有字符。但是問題出在unicode6系列編碼上,它們需要4個字節(jié),這部分就是有名的emoji。如果我們的數(shù)據(jù)庫使用utf8,是無法存儲emoji表情的。正好utf8mb4一個字符最多能存4字節(jié),相對于utf-8來說能支持更多的字符集,也能滿足存儲moji表情的需求。

特別注意的是從MySQL 5.5.3 版本才開始提供了utf8mb4字符集,支持四字節(jié)的字符。另外JDBC驅(qū)動版本要求mysql-connector版本高于5.1.13

1.6、MySQL視圖和表

視圖和表是MySQL數(shù)據(jù)庫中兩個需要掌握的基礎(chǔ)知識,它們相似又有很大差異,表是真實存在的,占用內(nèi)存。而視圖是虛擬的,不占數(shù)據(jù)庫空間。視圖是數(shù)據(jù)庫中的查詢sql的語句,可以理解為保存后的查詢結(jié)果,它保存的是“真實表”經(jīng)查詢后的結(jié)果。

比如我們在上面建了兩張表:用戶表(user)和崗位表(post),表中存儲的數(shù)據(jù)是真實存在與磁盤當(dāng)中的(我們也可以反向思考如果表中的數(shù)據(jù)不是真實存在的,那數(shù)據(jù)庫就沒有意義了)。那為什么有了表還需要視圖呢?當(dāng)我們需要對數(shù)據(jù)庫中的一張或多張表的某些字段進行查詢時,需要編寫一些關(guān)聯(lián)SQL語句把我們需要的字段單獨列出來,但我們又不想每次都去輸入查詢的SQL語句,那我們就可以定義一個視圖,保留這個查詢的SQL語句,下次就可以直接使用,注意是知識保留SQL語句并不保留SQL語句查詢出來的結(jié)果數(shù)據(jù)。如果表中的數(shù)據(jù)發(fā)生了變化,從視圖中查詢出的數(shù)據(jù)也會隨之發(fā)生改變。同樣使用視圖語句進行增刪改也會影響表中的數(shù)據(jù)。

基本語法:

創(chuàng)建視圖:create view view_name as select * from table_name;

查詢視圖:select * from view_name;

刪除視圖:drop view view_name;

舉個例子:我們使用語句創(chuàng)建視圖:create view myview as select user_id,user_name from user;然后再查詢視圖 select * from myview;就可以看到數(shù)據(jù)。


 

1.7、MySQL數(shù)據(jù)分區(qū)

1.7.1、數(shù)據(jù)分區(qū)的概念

數(shù)據(jù)分區(qū)是一種物理數(shù)據(jù)庫的設(shè)計技術(shù),它的目的是為了在特定的SQL操作中減少數(shù)據(jù)讀寫的總量以縮減響應(yīng)時間。分區(qū)并不是生成新的數(shù)據(jù)表,而是將表的數(shù)據(jù)均衡分攤到不同的硬盤,表實際上還是一張表。分區(qū)可以做到將表的數(shù)據(jù)均衡到不同的地方,提高數(shù)據(jù)檢索的效率,降低數(shù)據(jù)庫的頻繁IO壓力值。

我們可以理解是將同一張表中不同規(guī)則的記錄分配到不同的物理文件中。比如我們在表中某一字段設(shè)置按日分區(qū),在按照日期進行查詢時,就會到對應(yīng)的分區(qū)表中查找數(shù)據(jù),縮小了查詢范圍,大大提升了查詢效率。

1.7.2、如何進行分區(qū)

我們要注意在創(chuàng)建分區(qū)要在剛開始創(chuàng)建表的時候同時創(chuàng)建分區(qū),我們以按年分區(qū)為例:


 

2、常用函數(shù)

2.1、CONCAT函數(shù)

CONCAT(str1,str2) 函數(shù)用于將多個字符串連接成一個字符串,返回結(jié)果為連接參數(shù)產(chǎn)生的字符串。如有任何一個參數(shù)為NULL ,則返回值為 NULL。

比如我們執(zhí)行:select CONCAT('My', 'S', 'QL'); 返回結(jié)果 MySQL。我們執(zhí)行:select CONCAT('My', NULL, 'QL');返回結(jié)果是 NULL


 

2.2、 REPLACE函數(shù)

REPLACE(str,str1,str2),把str字符串中出現(xiàn)字符串str1的全部替換為字符串str2。注意MySQL里面全部替換是REPLACE,而不是REPLACEALL,不要弄混。

2.3、ISNULL函數(shù)

ISNULL(expr) 函數(shù)判斷expr是否為空,如expr為null,那么isnull()的返回值為1,否則返回值為0。注意isnull('')和isnull("")是返回0的。


 

2.4、IFNULL函數(shù)

ifnull(expr1,expr2)表達式,表示如果expr1不為NULL,則IFNULL()的返回值為expr1; 否則其返回值為expr2。


 

2.5、group by(分組)、having (過濾)和order by(排序)

group by(分組)、having (過濾)和order by(排序)這三個函數(shù)我們單獨使用時,是非常好理解的,我們這里主要討論它們一起聯(lián)合使用,很多人容易弄混淆。我們常常將它們組合在一起用,完成分組+排序的功能。

我們首先了解幾個知識點:having一般是和group by一起使用;在sql命令格式使用的先后順序上,group by 先于 order by;order by不會對group by 內(nèi)部進行排序,如果group by后只有一條記錄,那么order by 將無效。要查出group by中最大的或最小的某一字段使用 max或min函數(shù);group by、having、order by的使用順序:group by 、having、order by。

我們來寫個例子,查詢user表中按照年齡(user_age)分組,重復(fù)次數(shù)大于1,并且按照重復(fù)次數(shù)由大到小排列:


 

3、MySQL常用場景

3.1、MySQL的批量插入

這個在之前的一篇文章《MyBatis 批量插入使用 foreach 循環(huán)插入的優(yōu)化,使用分片多線程》中已經(jīng)詳細的介紹過了。通過foreach 循環(huán)插入,大量數(shù)據(jù)時配合分片批量插入。我們再延伸一個,在插入時,已存在的數(shù)據(jù)進行更新不再重復(fù)插入,使用MySQL的 ON DUPLICATE KEY UPDATE。


 

3.2、MySQL中刪除重復(fù)數(shù)據(jù)只保留一條
我們以user表為例,刪除user_name同名的數(shù)據(jù),只保留一條。簡單的處理方式就是通過HAVING查詢重復(fù)的,然后保留id最大的那一條數(shù)據(jù)。


 

3.3、mysql 多表關(guān)聯(lián)更新

對于多表關(guān)聯(lián)更新的操作需要慎重,建議在更新前,先使用 SELECT 語句查詢驗證更新的數(shù)據(jù)與自己期望的是否一致。多表聯(lián)合更新有很多種方式,可以使用INNER JOIN、LEFT JOIN,也可以使用子查詢,下面就編寫一個示例。

 

UPDATE USER u
INNER JOIN post p ON u.user_id = p.user_id
SET p.post_name = u.user_name;

 

4、MySQL常用技巧

4.1、數(shù)據(jù)庫執(zhí)行腳本生成實體類信息


 

示例:


 

4.2、獲取漢字首拼音(包含特殊符號)函數(shù)


 

4.3、MySQL生成數(shù)據(jù)字典


 

示例:


 

4.4、Excel生成insert語句

有時候需要將Excel中數(shù)據(jù)導(dǎo)入到Mysql數(shù)據(jù)庫中,此時,可以利用insert into腳本,整理sql數(shù)據(jù),直接將數(shù)據(jù)插入到mysql數(shù)據(jù)庫中。

示例:在excel單元格中對應(yīng)的行填入公式:="INSERT INTO user(user_name, user_age, user_phone) VALUES ('"&A1&"', '"&B1&"','"&C1&"');"

主鍵user_id為自增,創(chuàng)建時間create_time默認取系統(tǒng)當(dāng)前時間,所以這兩個字段不需要賦值。

分享到:
標(biāo)簽:MySQL
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運動步數(shù)有氧達人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定