通配符
- %:任意類型、任意長度字符
- _:任意單個字符
- 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:

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ù)安全性