① sql連表查詢跟一個個表查詢那個快各有什麼優點和缺點
SQL連表查詢稱為聯合查詢,一個個表查詢是單查詢。兩者的區別和優缺點如下:
1、從開發效率來看:
聯合查詢是需要多個單查詢進行邏輯組合才能完成的查詢的工作,聯合查詢僅僅需要一個SQL就可以完成查詢工作,即把業務邏輯放到了SQL中,由資料庫來處理,相對來說開發效率會比較高些。
2、從查詢效率來看:
單查詢的可重用性較高,所以效率相較之聯合查詢會更高。
在資料庫進行讀寫時,資料庫會用鎖機制,限制其他連接對其操作。由於聯合查詢查詢速度比單個查詢要慢很多,這樣聯合查詢會增加鎖的競爭關系,所以用單查詢會更好。
3、從邏輯架構分層原則來看
關聯關系代表了業務規則/邏輯,如果大量使用關聯查詢,就是把大量的業務規則和邏輯放在資料庫來執行了,資料庫消耗cpu、內存、io等資源會大大增加。
4、從資源利用率方面看
大部分場景下,並不是所有關聯查詢的結果都被有效使用了。例如後台管理的列表界面會分頁顯示,關聯查詢的結果集,只有當前頁的數據被使用,但資料庫需要消耗額外資源得到全部結果集。
5、從架構的伸縮性方面看
大量的關聯查詢會導致集中式的資料庫架構很難向分布式架構轉換,伸縮性方面的優化難度高。關聯查詢方便快速,開發效率比較好。
不使用關聯查詢在架構層面有很多優點,但對系統分析和設計、開發能力要求高。一般在互聯網行業等用戶數較多的情況下最好重視這方面。
題主的兩個查詢由於數據量不多,效率上基本沒有差別,但在實際應用中要根據數據量、業務復雜度等去綜合評估。
② 做邏輯運算時,寫程序里好還是sql資料庫里好
做
邏輯運算
時,寫程序里好還是
sql資料庫
里好
如果你的資料庫服務比較繁忙,還是放到CS中處理較好。
資料庫的任務主要是保存數據/查詢數據
計算的事,能放在CS中盡量放到CS中。
③ 資料庫系統優化--業務邏輯設計優化
【IT 技術分析】
當我們優化一個系統時 有時發現一種情況就是自己修改SQL 索引以及分區是不能解決性能問題的 這時你要考慮業務邏輯優化和表設計的重構 這兩點的確和設計結合的很緊密
業務邏輯優化
結合實際 我們先談談業務邏輯優化
案例一
我們的系統一個文檔模塊 客戶點擊時很慢 通過性能分析 是點擊是去查詢資料庫 這散源時系統是通過Hibernate來兩步處理
計算該類型的文檔數量總數
顯示最新文檔的前 篇文檔
這時顯示第二步的時間是很快的 只取 條記錄 但是計算該類型的所有總數很慢 系統的這時的輸入是很大的(計算該類型的全部文檔 可能有幾萬篇數據) 輸出就一條總數 這時因為業務邏輯復雜 即使建立索引 分區等等速度也是無法提高 因為不能真正做到索引覆蓋和分區消除
客戶是點一下要等十幾秒是不能容忍的 這時可能輸入數據量很大下 資料庫很可能採用的是hash聯結 而且並發用戶一大 資料庫伺服器壓力很大
這時常規的優化方法是沒有效果的 這時我們也發現 客戶其實對以前比較老的數據是不關心的 一般只是對近期的數據比較感興趣 所有我們就在查詢時默認設定半年的時間 然後在時間上設定聚集索引 並默認在此時間上排序 使其使用合並聯結 減少輸入數據量 結果速度有明顯的提升
案例二
我們在優化一個客戶系統時 碰到一種情況 在客戶的一選擇功能時 客戶點擊一下選擇相關數據 這時頁面要要幾分鍾才能出來 客戶很不滿意 這時修改sql和索引都沒有辦法 他的輸入的數據量也很大 和上面一下也要計算總數和取最新前幾條數據
這時我們在查詢是關聯了人員 通過調查 發現客戶只對和自己相關的數據感興趣 也只是查詢自己相關的數據 所以這時在sql語句里增加用戶id這條限制 同時在增加userid的索引 這樣一來 速度就大大提高
總結
當然以上兩個案例 是從輸入入手 減少輸入和輸出的數據量 主要優化業務邏輯 達到優化系統 當然有些情況要和客戶確認和說服他們 有時他們不一定都認可 這時要說明這樣做的目的 相信他們也會理解
表設計優化
表設計 在我們開發系統時已經確定 好的設計的確能大大提高性能 我們在優化系統時 碰到段掘埋一個比較麻煩的問題
原文 資料庫重構(一) 欄位合並
這條sql是判斷 個維度 一個用戶id 一個機構id 一握螞個崗位id 還有級別判斷和是否公共 sql語句里有 個 or 組成查詢 表數據一大就表掃描 性能很差 但業務要求和系統要求這樣判斷 即使在表中這五個欄位都建索引 速度也不會快 太多 OR 了 SQL Server 查詢分析器無法優化
這時由於設計時 用戶id 機構id 崗位id為 個只有一個有數據 所以將這 個欄位合並 較少 Or 語句 讓資料庫能使用索引
總結
lishixin/Article/program/SQL/201311/16321
④ 一個Java程序員有必要精通SQL么
程序員精通SQL是最基本的要求
因為做的程序是需要跟數據進行交互的,沒有數據交互的程序,應用層面太狹隘了。
國外的崗位區分的很明確,專門寫代碼的,專門做資料庫的,即便如此,也有區分,專門處理前台的、後台,專門做框架的架構師,還有專門的測試工程師。
但是國內不同,基本上程序員要掌握除了架構以外的全部技能。可以說國內的一流程序員就是萬能的,什麼都會。
這個也導致了國內IT行業從業人員入門的門檻高,培訓不規范。新人不知道該從何入手。
現在國內的IT行業人才缺口很大。這個問題,本身跟行業規范也有一定原因。
作為剛剛進入行業的程序員,第一考慮的是自身能力一定要跟上公司的技能需求,然後在此基礎上不斷學習,有方向有機會的學習新的技能。這樣才能拿到高薪。