MySQL是非常流行的關(guān)系型數(shù)據(jù)庫,雖然擁有的SQL語法大部分是符合ANSI SQL標(biāo)準(zhǔn)的,但是它自身還是攜帶了很多優(yōu)秀的、私有的語句和指示符,今天我們就來分析一下。
EXPLAIN
難度指數(shù):★ ★ ★ ★ ★
推薦指數(shù):★ ★ ★ ★ ★
當(dāng)我們網(wǎng)站或者接口訪問頻率越來越大,這時(shí)如果我們的相關(guān)SQL語句執(zhí)行時(shí)間很長的話,就很容易造成網(wǎng)站或者接口響應(yīng)慢的情況,那么使用explain語句,我們能夠清楚的知道MySQL是怎么執(zhí)行我們的SQL語句的,執(zhí)行某個(gè)查詢語句總共查詢了多少條記錄,使用了什么表以及多表的鏈接順序是怎么樣的,該查詢使用了哪些索引等等信息,有了這些信息,我們能夠根據(jù)多次執(zhí)行和分析優(yōu)化我們的數(shù)據(jù)庫,該建立索引的建索引,該刪除的索引就刪除掉。
FOR UPDATE
難度指數(shù):★ ★ ☆ ☆ ☆
推薦指數(shù):★ ★ ★ ★ ★
有時(shí)我們有這樣的一種情況,就是需要將某個(gè)SELECT語句查詢的行進(jìn)行鎖定,防止其他客戶端修改,那么這個(gè)時(shí)候,我們可以使用這個(gè)指示符來完成。
DELAYED
難度指數(shù):★ ★ ☆ ☆ ☆
推薦指數(shù):★ ★ ★ ★ ★
有時(shí)發(fā)現(xiàn)我們的產(chǎn)品的某個(gè)插入、更新操作不需要立即生效,也就是一些對(duì)讀要求高、寫要求不太高的應(yīng)用,可以使用這個(gè)指示符,就是將這個(gè)插入或者修改后的數(shù)據(jù)不是立即寫入到磁盤文件中去,而是等到MySQL數(shù)據(jù)庫非常空閑的時(shí)候再進(jìn)行寫入的操作,從這里來看,這個(gè)指示符也算是一個(gè)小的優(yōu)化性指示符。
SQL_CACHE
難度指數(shù):★ ★ ☆ ☆ ☆
推薦指數(shù):★ ★ ★ ★ ★
有時(shí)我們的產(chǎn)品讀操作非常多,修改頻率比較低,那么這個(gè)時(shí)候我們能夠在執(zhí)行select查詢的時(shí)候指定sql_cache這個(gè)指示符,這樣該查詢語句和相應(yīng)的查詢結(jié)果將被緩存起來,那么下次執(zhí)行同樣的查詢語句時(shí),如果數(shù)據(jù)沒有發(fā)生改變,那么將直接返回這個(gè)緩存的結(jié)果給客戶端,從這里來看,這個(gè)查詢語句指示符主要用于一些特性應(yīng)用場(chǎng)景的優(yōu)化操作。
ON DUPLICATE KEY UPDATE
難度指數(shù):★ ★ ☆ ☆ ☆
推薦指數(shù):★ ★ ★ ★ ★
我們知道,在MySQL中有一個(gè)特殊的語句就是Replace語句,就是當(dāng)插入的時(shí)候,我們發(fā)現(xiàn)某個(gè)條件(這里需要注意的是,這里指的是***索引或主鍵)的數(shù)據(jù)已經(jīng)存在了,那么這個(gè)時(shí)候就先刪除這條數(shù)據(jù),然后再插入新的數(shù)據(jù),也就是先刪除再插入,但是有時(shí)候我們僅僅需要的是,如果存在了僅僅修改某個(gè)字段的值,而不是刪除再插入,那么這個(gè)時(shí)候可以使用ON DUPLICATE KEY UPDATE來完成。