close

我相信大家都知到資料庫有所謂的索引,但是我相信很多人都不清楚怎麼用才是最好的。

我用下方來舉例。

有下方一個資料表:

TABLE_A
COL_A COL_B COL_C COL_D COL_E COL_F

當你有一串長用的SQL,當中只有WHERE 後面比對的值會不段的變動。

SELECT * FROM TABLE_A WHERE COL_A='123' AND COL_B='455' AND COL_E='789'

剛開始的時候資料量少,期時搜尋起來你沒什麼太大感覺。

突然有一天,你發現資料變超多,而且跑這段的時候變超慢。

 

你就可以考慮用索引的方式來解決,但是重點來了,怎麼建索引才是比較好的方式呢?

每個欄位個別建一次?
ALTER TABLE `TABLE_A` ADD INDEX(`COL_A`);"
ALTER TABLE `TABLE_A` ADD INDEX(`COL_B`);"
ALTER TABLE `TABLE_A` ADD INDEX(`COL_C`);"
ALTER TABLE `TABLE_A` ADD INDEX(`COL_D`);"
ALTER TABLE `TABLE_A` ADD INDEX(`COL_E`);"
ALTER TABLE `TABLE_A` ADD INDEX(`COL_F`);"

你要這麼做也可以,但是不一定會比較有效率而且會衍生出很多不必要空間的浪費。

索引就像式書的目錄頁一樣,他會幫你把裡面的資料資料先建一份目錄,讓你知道你查的值式式落在哪個區間。
就像是我們可以透過書的目錄,直接查到我們要的資料在哪一頁,可以直接翻到那頁去看。

但你會問,那上面的建法哪裡不好?不是一個一個去建立,這樣在查不是比較好馬?

但是像我最上面舉例的SQL 查詢,我其實只有用到 COL_A COL_B COL_E,而且這三個欄位都會一起查詢。
所以我會用這三個欄位建一個索引。
ALTER TABLE `TABLE_A` ADD INDEX(`COL_A`,`COL_B`, `COL_E`);"

因為這樣的他會把三個值相關敘述去做索引。

以這段範例的SQL 來看,後者的查詢速度會比前者快很多。

但是這樣的建法就會變成要依照SQL的來建立索引,一個TABLE 可以就會有多個索引。

或女你的資料量不大,但是當資料量大,甚至到10筆以上的時候,你就非得這樣考慮不可了。

 

 

arrow
arrow
    文章標籤
    索引 MYSQ
    全站熱搜
    創作者介紹
    創作者 阿基 的頭像
    阿基

    四處流浪的阿基。I am Vagrant Walker

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