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