天天看點

盤點mysql中容易被我們誤會的地方

  引語:mysql作為資料庫的一大主力軍,到處存在于我們各種系統中,相信大家都不陌生!但是,你知道你能用不代表你知道細節,那我們就來盤點盤點其中一些我們平時不太注意的地方,一來為了有趣,二來為了不讓自己踩坑。

  聲明:要想知道細節,那就去閱讀源碼,我實在沒那本事,隻能從片面上來說一些事!

  1. 不區分大小寫(字段名)

    mysql的查詢字段名不區分大小寫,但是查詢的内容是要區分大小寫的,是以能用下劃線命名的就不要用大小寫來區分命名了,如:

SELECT uid,v_state FROM all_user WHERE username = 'sunyue';
SELECT uid,v_state FROM all_user WHERE USERNAME = 'sunyue';            //與上一個語句結果一樣,字段不區分大小寫

SELECT uid,v_state FROM all_user WHERE USERname = 'SUNYUE';            //查不到資訊,内容要區分大小寫      

  2. 模糊比對([_]比對任意字元)

    雖說模糊比對有點正則的意思,但是你并不能像正則一樣自由地在資料庫裡進行比對,做到盡量簡化比對就好!(附名詞:全文檢索sphinx)

SELECT uid,v_state FROM all_user WHERE USERNAME LIKE 'su_yue';    //下劃線[_]比對任意單個字元
SELECT uid,v_state FROM all_user WHERE USERNAME LIKE 'su%yue';    //%比對任意多個字元

SELECT uid,v_state FROM all_user WHERE USERNAME NOT LIKE 'su%';        //not like取不包含的資訊      

  3. 怎樣猜測一個功能

    mysql作為一個關系型資料庫,面向的是普通的開發者,是以一切盡可能做到人性化。是以,如果你不知道某個功能是什麼,那麼,也許你可以猜得出來,因為,如果一個功能讓别人無法猜出個大概,那麼也許,他就是失敗的設計。對于mysql,隻要你英語水準稍微好一點點,就能很輕松的想到關系查詢應該怎麼寫。是以,猜測的能力,在于你英語的水準,哈哈哈!!!

  4. replace into 文法

    replace into 是一個很粗暴的插入方式,不過在适當的場景使用也是很有必要的,比如一些需要随時覆寫式寫入的資料,就應該使用replace, 但是對于一些自增型的表,則應盡量避免使用,因為這樣會是對ID的一種浪費,也許沒必要使用replace.

  5. insert into on dumplicate key update 文法

    這個寫法相對來說就溫柔多了,但是速度肯定是慢一點的,據說隻有mysql才有這個特性哦,如果你不想在插入前去判斷一下是否已存在該資料,也許這是一個不錯的選擇!

  6. explain 文法

    這是一個檢查查詢效果的有效方式,其實我本人很少使用這功能,但是,如果一個開發者經常使用這功能,那麼,我相信,他本人肯定是個牛掰的人。通過這個指令,可以判斷出你寫的語句是否是優化的,如果不是,方向是什麼。應該說,你用得多了,自己自然就知道結果了,還是多用用吧!

  7. 索引長度

    myisam的索引長度最大為1000位元組,innodb的索引長度最大為767位元組!注意使用哦,超出範圍,則超出預料!

  8. 庫的複制

    1. 直接資料mysql自帶的資料庫備份恢複指令;2. 直接拷貝檔案到目的伺服器(注意程序占用問題);3. 使用工具進行同步;個人感覺第二種方式最簡單!

  9. 分區

    對于一些可能會很大的表,需要進行分區操作,如果有這方面的需求,需要在最開始就添加至少一個分區,否則後期将無法操作分區。(至少我是這麼認為的)

  10. 慢查詢

    慢查詢,這是一個對性能的監控問題,如果伺服器表現太差,排查問題時,有這種慢查詢的記錄,排查起來将事半功倍!

  11. binlog

    binlog,一般都會用到這功能,對于資料恢複,資料操作記錄等等有很必要功用!

  12. 其他應該要知道的視圖、存儲過程、事件...

    視圖、事件等,這些都是一些進階應用,我發現很多項目根本不存在這種應用,到少我遇到的項目都幾乎不涉及或者涉及了也是别人随便做做!但是進階功能還是要了解的,不管有沒有用!

  13. 可使用的工具         

     phpMyAdmin, 作為遠端安全操作資料庫的方式,還是很不錯的,但是作為本地操作的話,實在有點笨拙;sqlyog, 界面雖古闆,但是還是比較友善的;navicat, 比較專業化,不過你得适應他的各種表現形式;指令行,我想應該不會有人直接使用指令行進行操作吧,不過,指令行才是根本呢!

  需要加深的東西很多,如果有時間能力,應該深入源碼!!!

  附加@2016-04-08:

  1. order by 和 group by 的一些小技巧

  group by 比order by先執行,order by不會對group by 内部進行排序,如果group by後隻有一條記錄,那麼order by 将無效。要查出group by中最大的或最小的某一字段使用 max或min函數,但并沒有做到将一整行篩選出來的效果。如:

  select a.id,a.add_time,max(b.id) as b_id, sort from t_main a left join t_main_sub b on a.id=b.main_id group by b.main_id order by b.id desc;

  喲呵,拖了這麼久,終于補上一篇了!!

不要害怕今日的苦,你要相信明天,更苦!