Mysql學(xué)習(xí)筆記(1)

通配符

  • %:任意類型、任意長度字符
  • _:任意單個字符
  • escape:配合轉(zhuǎn)義字符/使用,轉(zhuǎn)移字符后面的通配符將丟掉通配符的作用:
select username from gg_user where username like '%xiao/_%' escape '/'

聯(lián)結(jié)查詢

mysql聯(lián)結(jié)查詢包括內(nèi)聯(lián)結(jié)(inner join)和外聯(lián)結(jié)(left join和right join),沒有full join:


sql聯(lián)結(jié)查詢.png

inner join

內(nèi)聯(lián)結(jié),查找出兩個表都有的滿足聯(lián)結(jié)關(guān)系的數(shù)據(jù)行:

SELECT user.id,user.name,question.title
FROM
    user inner JOIN question 
on
    user.Id = question.user_id

如上,找出user和question表中滿足條件的所有數(shù)據(jù)行

left join

左外聯(lián)結(jié),查找出兩個表都有的滿足聯(lián)結(jié)關(guān)系的數(shù)據(jù)行,以及左表有、右表沒有的數(shù)據(jù)行:

SELECT user.id,user.name,question.title
FROM
    user left JOIN question 
on
    user.Id = question.user_id

如上,找出user和question表中滿足條件的所有數(shù)據(jù)行,但也可以找到不滿足這個聯(lián)結(jié)條件的user表中的數(shù)據(jù)行

right join

與left join相反,可以找到右表有但左表沒有的數(shù)據(jù)行

SELECT user.id,user.name,question.title
FROM
    user right JOIN question 
on
    user.Id = question.user_id

如上,找出user和question表中滿足條件的所有數(shù)據(jù)行,但也可以找到不滿足這個聯(lián)結(jié)條件的question表中的數(shù)據(jù)行

Mysql為什么不建議使用join(摘自網(wǎng)絡(luò))

不建議直接在數(shù)據(jù)庫層面使用表聯(lián)結(jié),建議在數(shù)據(jù)庫層面僅使用單表查詢,在service層再通過dao使用多表關(guān)聯(lián),將多表的查詢在service層進(jìn)行分解,原因如下:
用分解關(guān)聯(lián)查詢的方式重構(gòu)查詢有如下的優(yōu)勢:

  • 讓緩存的效率更高。許多應(yīng)用程序可以方便地緩存單表查詢對應(yīng)的結(jié)果對象。如果關(guān)聯(lián)中的某個表發(fā)生了變化,那么就無法使用查詢緩存了,而拆分后,如果某個表很少改變,那么基于該表的查詢就可以重復(fù)利用查詢緩存結(jié)果了。

  • 將查詢分解后,執(zhí)行單個查詢可以減少鎖的競爭。

  • 在應(yīng)用層做關(guān)聯(lián),可以更容易對數(shù)據(jù)庫進(jìn)行拆分,更容易做到高性能和可擴(kuò)展。

  • 查詢本身效率也可能會有所提升。查詢id集的時候,使用IN()代替關(guān)聯(lián)查詢,可以讓MySQL按照ID順序進(jìn)行查詢,這可能比隨機(jī)的關(guān)聯(lián)要更高效。

  • 可以減少冗余記錄的查詢。在應(yīng)用層做關(guān)聯(lián)查詢,意味著對于某條記錄應(yīng)用只需要查詢一次,而在數(shù)據(jù)庫中做關(guān)聯(lián)查詢,則可能需要重復(fù)地訪問一部分?jǐn)?shù)據(jù)。從這點看,這樣的重構(gòu)還可能會減少網(wǎng)絡(luò)和內(nèi)存的消艷。

  • 更進(jìn)一步,這樣做相當(dāng)于在應(yīng)用中實現(xiàn)了哈希關(guān)聯(lián),而不是使用MySQL的嵌套循環(huán)關(guān)聯(lián)。某些場景哈希關(guān)聯(lián)的效率要高很多。

  • 分布式的分庫分表,這種時候是不建議跨庫join的。目前mysql的分布式中間件,跨庫join表現(xiàn)不良

MyISAM 和 InnoDB 對比

數(shù)據(jù)庫引擎都是表級別的

MyISAM引擎

  • 該引擎是用B+樹建立索引,MYI文件存儲索引,MYD文件存儲具體數(shù)據(jù),通過對索引字段構(gòu)建B+樹,將葉子結(jié)點映射到數(shù)據(jù)的物理地址上,進(jìn)行高校查詢
  • MyISAM是非聚集索引,葉子結(jié)點存儲的不是實際數(shù)據(jù),是數(shù)據(jù)的地址

InnoDB引擎

  • 該引擎沒有MYI文件,索引和數(shù)據(jù)都保存在同一個文件
  • 該引擎通過主鍵構(gòu)成的索引是聚集索引,葉子結(jié)點存儲的是對應(yīng)整行的實際數(shù)據(jù);非主鍵的索引為輔助索引,葉子結(jié)點保存的是該行的主鍵

為何建議InnoDB主鍵用自增主鍵?

  • 插入層面:在新增數(shù)據(jù)時,如果主鍵不是自增主鍵,而是隨機(jī)主鍵,重新構(gòu)建索引樹將導(dǎo)致插入數(shù)據(jù)不連續(xù),造成磁盤存儲數(shù)據(jù)的頻繁移動;如果是自增主鍵,能夠保證新插入的數(shù)據(jù)都在葉子結(jié)點的鏈表尾部,不會引起之前數(shù)據(jù)的物理地址頻繁變動,加入數(shù)據(jù)的順序和B+數(shù)葉子節(jié)點分裂順序一致
  • 有時候不選擇自增主鍵:保證分布式分庫分表情況下主鍵不重復(fù);保證數(shù)據(jù)安全性
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容