本文是在做一家汽車配件的電商網站時,大體情景是一個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語句)。