close
看電影必備神器:http://goo.gl/l9HvOo

當然,你也可以用上高科技的方法:數據庫索引,情況會大不相同。數據庫索引是對數據庫裡的數據按照某個屬性進行排序的一種方式。瑪麗亞 貝羅有兩個關鍵詞,某個屬性,排序。某個屬性是指,索引是跟某個具體的屬性掛鉤的,比如上面例子裡的「用戶使用時長」。排序的意思是,儘管你往數據庫裡插入數據的時候是隨便插入的,但是索引會保持「用戶使用時長」從小到大或從大的順序。有了這電影院個順序,查詢就可以用二分法,不用一個一個比對,快多了。

經過前面文章(天天鼓搗數據,你知道數據庫長啥樣嗎?)的科普,相信各位對數據庫應該有一個直觀的印象了吧?數據庫說白了就是硬盤上的一個文件,這個文件裡面有若干個表,每個表裡存了很多條數據。你可以通過一種叫SQL的語言,也就是一些命令,來增加、刪除、修改和2016好看的電影查詢這個文件裡存儲的數據。

現在你來查詢使用時長最長的用戶,很簡單,找索引的最大值就好了,這個應該是一下子就出來的事情,因為它本來就是從小到大的。或者說你想找「使用半小時」的用戶,輸入30分鐘,在索引裡利用前面講的「二分法」,幾下就找到了30分鐘這個值,然後呢,根據這個值額外記錄的「在數據庫中對應位置」的信息,就能順籐摸瓜從數據庫裡找到這個用戶啦。

二分法是啥意思?你有沒有玩過猜數字的遊戲,別人想一個數字,讓你猜,猜的時候他說大了還是小了,怎麼猜最快?很簡單,先猜一個小的,再猜一個大的,然後取中點,再取中點,每次取中點,直到猜中,是最快的。同理,一堆排好序的數字裡面找一個數字,比如下面7個數字裡面找9,每次都找中間的,依次經過8、12、9,不用比對7次,3次就找到了。這就是二分查找。

那麼,此時計算機在做什麼呢?它首先要找到並打開正宗哥吉拉 心得那個有user_table表的數據庫文件,然後開始一條一條的讀取裡面的數據:啊,小絕鯊島分級神鬼認證5好看嗎?花,每天使用2個小時,嗯,記下來。全蛋,5分鐘,沒有小花時間長,扔掉。大寶,10個小時,哇,把小花扔掉。一直等到讀完10萬條所有的數據,才查到一個(或多個)最大的結果。此時硬盤已經冒煙了。

這麼說來,程序員跟你說中病毒了,很有可能是他不想給你航海王劇場版10做優化編出來的呢,一定要警惕啊。

以前需要一個一個從硬盤上讀取出來比對的,現在排序加二分法,省了很多時間。但是問題也很明顯,你應該想到了。創建數據庫索引,需要一個額外的磁盤空間,來存放索引。這個也是不小的開支。雖然索引的每一項,只是記錄了它的值大小,以及它在原來數據庫裡的位置,現在數據庫都是幾千萬條數據,開銷也不小。

上面的例子,如果用索引,應該是這樣的。首先對「用戶使用時長 」這個屬性創建一個索引,一開始是空的,什麼都沒有。你每次插入一條數據,比如大雄,使用時長37分鐘,就把37分鐘這個數值放到索引裡,並使索引裡的所有數值保持從小到大的順序。經過一段時間,數據庫裡有了10萬條數據,索引裡也有了很多排好序的「用戶使用時嬰兒哭聲長」。每個時長,還會額外記電影 時刻 表錄它在原來數據庫裡的對應的位置。為什麼?後面解釋。

速度慢要怪就怪硬盤。搞IT的應該有個共識,就是離CPU越遠的存儲設備,速度越慢,先是高速緩存,然後是內存,才是硬盤,還有網絡是最慢的。SSD還好電影app一點,普通的機械硬盤,只有幾十兆的吞吐量,拷一部電影都要幾分鐘,拷一堆小文件更是慘不忍睹。扯這麼多是想說明什麼呢?是說數據庫大多數情況下是在查詢數據,查詢一次數據,就要讀取磁盤上的數據庫文件,而且是非常頻繁的讀取,速度問題就是這麼來的。

這麼說吧,你有一個數據庫,存了10萬個用戶的產品日使用時長,從幾分鐘到幾個小時都有。現在,產品經理想查出使用時長最長的那個用戶,他航海王電影版 強者天下熟練的敲了一行命令(也有可能是熟練的點了某個自動查詢的按鈕):select ma賞金獵人 電影上映x(time) from user_table。如果這世界貓消失了 心得

魚還是熊掌,這就看你怎麼衡量了。如果你的數據庫,裝在一個硬盤空間很大,但是硬盤速度很慢的電腦上,當然可以用索引,空間換取時間,這也是大多數索引的應用場景。如果你的硬盤快滿了,或者說查數據的產品經理脾氣特別好,等多久都無所謂,那你不用開索引了,隨便編個什麼「電腦中病毒了,就是卡」之類的故事,搪塞過去就行。

你以為這樣就完事了?程序員可不能這麼想。程序員寫代碼,並不是「能用就好」那麼簡單。數據庫設計的好不好,擴展性怎麼樣,容錯性怎麼樣,都很重要。更多的情況是,你精心設計好了數據庫的結構,嚴格遵守了前輩們總結出來的所有規範,放到線上一跑,悲劇了,速度太慢,產品經理查個數據要等半天,這可怎麼是好?

一句話結尾,數據庫索引,對數據庫裡的某個屬性的所有值進行排序,從而加快查詢速度,是一種典型的空間換時間的思想,請君細細品味。

feifei
arrow
arrow

    myiesha166 發表在 痞客邦 留言(0) 人氣()