1、避免在where子句中使用 is null 或 not null
2、避免在where子句中使用!=或<>操作符
3、避免在where子句中使用or
4、少用 in 或not in
5、like萬用字元的使用 不要「%11%」 要「11%」
例如like「%name」或者like「%name%」,這種查詢會導致索引失效而進行全表掃瞄。但是可以使用like 「name%」。
那麼如何解決這個問題呢,答案:使用全文索引。
在我們查詢中經常會用到select id,fnum,fdst from dynamic_201606 where user_name like '%zhangsan%'; 。這樣的語句,普通索引是無法滿足查詢需求的。慶幸的是在mysql中,有全文索引來幫助我們。
建立全文索引的sql語法是:
alter table `dynamic_201606` add fulltext index `idx_user_name` (`user_name`);
使用全文索引的sql語句是:
select id,fnum,fdst from dynamic_201606 where match(user_name) against('zhangsan' in boolean mode);
6、避免在where子句中表示式操作 id/2=100 要用id=200
7、避免在where子句中進行函式式操作
8、在子句中使用exists代替in是乙個好選擇
9、避免在where子句中對字段進行null值判斷
對於null的判斷會導致引擎放棄使用索引而進行全表掃瞄。
10、避免隱式型別轉換
where子句**現column欄位的型別和傳入的引數型別不一致的時候發生的型別轉換,建議先確定where中的引數型別。
11、分段查詢
在一些使用者選擇頁面中,可能一些使用者選擇的時間範圍過大,造成查詢緩慢。主要的原因是掃瞄行數過多。這個時候可以通過程式,分段進行查詢,迴圈遍歷,將結果合併處理進行展示。
12、使用合理的分頁方式以提高分頁的效率
select id,name from product limit 866613, 20
使用上述sql語句做分頁的時候,可能有人會發現,隨著表資料量的增加,直接使用limit分頁查詢會越來越慢。
select id,name from product where id> 866612 limit 20
13、區分in和exists、not in和not exists
區分in和exists主要是造成了驅動順序的改變(這是效能變化的關鍵),如果是exists,那麼以外層表為驅動表,先被訪問,如果是in,那麼先執行子查詢。所以in適合於外表大而內錶小的情況;exists適合於外表小而內錶大的情況。
關於not in和not exists,推薦使用not exists,不僅僅是效率問題,not in可能存在邏輯問題。如何高效的寫出乙個替代not exists的sql語句?
關於sql server建立索引需要注意的問題
人們在使用sql時往往會陷入乙個誤區,即太關注於所得的結果是否正確,而忽略了不同的實現方法之間可能存在的效能差異,這種效能差異在大型的或是複雜的資料庫環境中 如聯機事務處理oltp或決策支援系統dss 中表現得尤為明顯。筆者在工作實踐中發現,不良的sql往往來自於不恰當的索引設計 不充份的連線條件和...
寫面試程式需要注意
這麼乙個小不點的函式,他從三個方面考查 1 程式設計風格 2 出錯處理 3 演算法複雜度分析 用於提高效能 規則1 2 1 為了防止標頭檔案被重複引用,應當用ifndef define endif結構產生預處理塊。建議1 2 2 不提倡使用全域性變數,盡量不要在標頭檔案中出現象extern int ...
if else語句需要注意的問題
if else 例題if else語句是一種分支結構,當條件滿足時,有 if語句 和 else語句 兩條分支。表示式的值在邏輯上只有真和假,故 if 和 else 在執行流程上是互斥的,執行且只能執行兩者中的乙個。if 條件表示式 else 條件表示式可以是關係表示式 邏輯表示式 算術表示式或混合表...