天天看點

MySQL的幾個細節小問題

(本文章裡,centos的系統指令用斜杠加粗來表示,以便各位閱讀~)

Centos裡,Mysql是5.1版本的話,那麼需要使用#service mysqld start來啟動服務,然後才能進入mysql的界面,而更新成5.5版本之後,指令改成#service mysql start。至于在linux下怎麼裝mysql,直接看http://lnmp.org/install.html就行,這個是裝Nginx的,裡面直接就順帶安裝了mysql5.5。

還有輸入指令就提示“ignoring query to other database”,這個問題就是在 “mysql -u使用者名 -p”的時候,沒有打那個u。

下面說點有營養的,在MySQL裡建立一個表1,起名叫A,隻有一個列叫“ID”,裡面有三個值,分别是"1""2"和NULL,注意,這裡是null,而不是"null",如果是"null",那麼輸入的其實是0.效果圖如下:

<a href="http://s1.51cto.com/wyfs02/M02/79/9E/wKioL1aWcpOA4T6iAADDEAWNmjs806.png" target="_blank"></a>

可見a表裡的元素是1 2 3 null,可是count(*)和count(id)得出的結論卻不是一樣的值,由此可見,count(id) 更加精準,因為他不包括null。

我們繼續,如果再建立一個b表,裡面有一個列叫b_id,有兩個元素,全是1,現在打算“顯示a表中裡與b表id一樣的數”,有兩種表達方法,一種是子查詢,一種是join查詢,一般來說都使用join查詢,join語句比較好寫,效果如下圖。

第一次用了子查詢,傳回一個“1”,第二次用了join語句,傳回了兩個“1”,也就是說出現了一對多的情況,這種情況要在join前加上DISTINCT來取消重複項。

假設伺服器裡有一個較龐大的表,每一次SELECT都會舟車勞頓,于是在EXPLAIN SELECT一下是一個好辦法,例子中的表結構如下圖:

<a href="http://s3.51cto.com/wyfs02/M01/79/9F/wKioL1aWeL3gFyvlAABQyJswKGU488.png" target="_blank"></a>

LIMIT 50,5是從51開始,到55結束,不包含50!

一個隻掃描了55行,一個卻掃描了953行外加使用了額外步驟,于是可見,優化limit查詢,主旨就是盡可能少的掃描資料,是以能用主鍵就用主鍵。我這裡的例子隻是從50行開始,如果是在生産中,表裡幾萬行乃至幾十萬行的資料,主鍵的掃描優勢非常明顯。

還沒完,如果我們不怕累,再多打幾個字。

SELECT film_id,description,title FROM sakila.film WHERE film_id &gt;55 and film_id &lt;=60 ORDER BY title LIMIT 0,5 \G

看看這個指令的EXPLAIN,掃描數字更喜人~LIMIT 0,5不是1,5;要是1的話,開頭是第57。這裡要小心!

重點放後面,這個用法主要用于一馬平川的主鍵資料表,中間主鍵不可以用空擋,意味着這個表裡不可以有過DROP記錄,不然的話,會出現真的空檔。

 本文轉自 蘇幕遮618 51CTO部落格,原文連結:http://blog.51cto.com/chenx1242/1734817

繼續閱讀