一、mysql 不加條件查詢速度挺快,加上過濾條件就特別慢是為什么
不加條件查詢,如果是自增主鍵的話,會順序讀盤,順序讀取磁盤數(shù)據(jù)的話,速度可以很快;添加過濾條件后,如果過濾條件不走索引,數(shù)據(jù)可能會隨機(jī)讀取,所以性能沒有順序讀取速度快。
舉個例子:
有一個放了很多五顏六色珠子的箱子,你從中拿10個珠子只需要抓一把數(shù)一下就可以了,但是如果讓你拿10個紅色的珠子呢?當(dāng)然就慢了。
而如果按照顏色拿珠子是經(jīng)常要做的事情,那么,怎么樣才能提高效率,加快速度呢?把箱子里分成一格一格,每個格子擺一個顏色的珠子,這樣不就快了嗎?當(dāng)然,在往箱子里放珠子的時候需要按照顏色擺放。這一格一格對應(yīng)到數(shù)據(jù)庫就是索引。
再擴(kuò)展一下,如果你是賣小商品的,你有很多種商品,但你的箱子數(shù)量是有限的,如果每樣商品放一個箱子,那么箱子數(shù)量不夠,如果無規(guī)律擺放,有空檔就塞進(jìn)去,那么找起來就麻煩了,那么怎么去做呢?估算每樣商品的數(shù)量,然后一號箱子放a,b,c三樣物品,二號箱子放d,e兩件物品,等等,這樣再查找物品時,就不需要每個箱子每個箱子的查找。那么,箱子對應(yīng)到數(shù)據(jù)庫其實就是表空間。
延伸閱讀:
二、聲明式與命令式
命令式(Imperative)和聲明式(Declarative)是很早就有的概念,比如 SQL、HTML、CSS 是典型的聲明式語言,而我們使用的絕大部分編程語言都是命令式的。
命令式編程就像它的名字一樣,它由開發(fā)者我們一步一步的告述計算機(jī),執(zhí)行一系列的操作,然后得到想要的結(jié)果,起主要作用的是開發(fā)者,計算機(jī)只是幫助開發(fā)者執(zhí)行計算而已。
而聲明式編程卻與此相反,它不是告述計算機(jī)做什么做,而是直接告述計算它想要的結(jié)果,至于怎么做,由預(yù)先寫好的程序依據(jù)一定的算法由計算機(jī)自動推算出來。
聲明式與命令式的主要區(qū)別在于,聲明式描述的是結(jié)果,它不關(guān)心過程。比如 SQL,我們告述數(shù)據(jù)庫的是,我們要查詢某張表滿足某某條件的數(shù)據(jù),但我們并不會告述數(shù)據(jù)庫怎么去查,怎么查數(shù)據(jù)是數(shù)據(jù)庫系統(tǒng)自己關(guān)心的事情。