天天看點

【mysql】一次有意思的資料庫查詢分析。

本文是在做一家汽車配件的電商網站時,大體情景是一個List.php頁面,該頁面分頁列出部配置設定件并統計總數量用于分頁。

當然該頁面中也可以指定一下查詢條件,如适配的車輛品牌、車系、排量、年份等,一件商品可能适配多種車輛。

是以建了個這麼個表:

goods_chexings表

列名依次為:車輛廠牌id,車系id,排量id,車型id(該車型的說法不太規範,客戶給的資料裡邊就叫車型,就這麼将就着用了,實際是年份的字元串如哪年開始到哪年結束),配件的id(該id源于good表)。

車輛廠牌id,車系id,排量id,車型id存在着層級關系,層級為:車輛廠牌id -> 車系id ->  排量id -> 車型id,表這麼建算是為了友善查找吧,有時候隻指定到廠牌或者車系,讓你列出來适配的配件。

。。。備援,備援哈,查找友善。

上PHP後端代碼哈:

查找時候的where子句:

然後select的主體

 大體說下goods表和goods_chexings表的數量級:goods幾千條,goods_chexings幾萬條。

但是List.php頁面,如果什麼條件都不指定的話,Waiting Time大約得10s,亮了。。。。

如果随便指定個車系、廠牌啥的,Waiting Time大約也就零點幾秒的,也亮了。。。。

補充一下,goods_chexings表上有索引的。。。。

看到這能猜到時間差距為啥那麼大了吧。。。。不指定查詢條件時join goods_chexings根本就沒用,隻查詢goods表就行了。

沒指定查詢條件 goods_chexings表上有索引根本就不起作用,全表掃描。。。。

修改後的查詢:

備注:寫統配的sql語句寫習慣了,不管查詢的時候起不起作用,可能使用到的表先from或者join了,

  如果出現要查詢的條件時就加在where子句裡邊。。。。。引起的索引不起作用,全表掃描了。

用到的mysql的分析指令:EXPLAIN extended   (SQL語句)。