sql 查询-从浆糊到清晰的过程
記錄從給一個查詢需求整理自己的思路.
當新手菜鳥遇到一個新的需求時, 往往 理不清楚 業務的思路. 導致sql寫不出來.
當今互聯網的需求增多, 程序很多放到 語言層面去處理了, 只要做單表查詢就可以滿足需求, 造成
很多人寫sql依然還是老大難.
?
記錄我整理遺留業務造成線上功能加載1分鐘才能展示問題:
?業務比較復雜, 當初設計的人也都走光了. 一個簡單的業務, 居然需要表關聯十多張表才能得到一個想要的sql結果集.
而sql線上執行都在40秒到1分鐘左右.
很是痛苦. 看到一個訂單表中, 拿一個訂單生成時間, 還需要到一個日志表中關聯獲取, 都要罵娘了, 且日志存到了mysql里...
這個也是無語的.
我也是新手. 這兩年多的業務做的基本也是以 語言層面為主. sql多是些 簡單的查詢.? 導致一直沒有 深入.?
遇到這個業務后. 就更加體會到 sql的重要性.?
?
拿到業務, 了解業務需求之后, 通過對數據庫表, 是最快可以全面掌握解決方案的.
反問法:? (針對查詢業務)
1. 要什么數據?
2. 要誰的數據??
3. 要哪個時間段的數據?
?
一般要什么數據, 那他就是作為主線了, 以它的維度, 去考慮.
多表關聯時, 一定要注意 笛卡爾積的問題.? wait?? 啥是笛卡爾積? 我忘了.?
笛卡爾積: 當你的主表與其他表做關聯時,.主表可能 就會查詢出很多數據.?
當在去與關聯表去 inner或者left? join時, 會拿著主表查詢出的數據 依次去與關聯表匹配.
假設:? 主表查詢出 2w條數據, 關聯表給的條件又能查出5000條,??
結果在關聯時, 會拿著2w條依次去和5k條匹配. 也就是 2w *乘以?5k的效果.
再說點好理解的, 我給你2萬把鑰匙, 你要試出哪些 能開這5k把鎖. 這能快嗎...
怎樣可以提高查詢效率呢.
可以單次只拿少量的鑰匙, 去匹配. 這是我這次的解決方案.?
先寫個簡單的sql, mysql的話, 使用limit 0,10, 每次只取10條,
用這個簡單sql作為一個臨時表, 在和關聯表匹配. 效率就高了
還有, 就是? 內連接和 左連接? inner和 left的使用掌握不好, 不知道何時用哪個.
思路:? 這個思路不絕對.?
還是基于第一個簡單的sql, 查詢出的結果如果都對的話, 關聯其他表, 基本都是取一些 相關聯的字段了
如果表關聯, 數量保持單表查詢時的數量, 一般情況可以假設是 關聯的關鍵字用對了,
如果單表查詢與關聯后數量不一致了, 可以做個分組, 還不一致, 就可以考慮, 換個 關聯關鍵字了.?
如果使用inner后, 數量少了, 說明關聯后, 沒有匹配到數據,? ?造成把兩個表中的數據都舍棄了
就要換成left了, 起碼保留主表數據.
除非. 要求兩個表的數據要么都要, 要么都沒有這種, 就使用inner join
暫時總結這么多, 留著自己復習理解吧
?
總結
以上是生活随笔為你收集整理的sql 查询-从浆糊到清晰的过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Netty高性能之道
- 下一篇: 用C处理字符串:键盘输入“yes”,则输