1. 程式人生 > >SQL使用(三)-----SQL優化總結

SQL使用(三)-----SQL優化總結

網上關於SQL優化的教程很多,但是比較雜亂。近日有空整理了一下,寫出來跟大家分享一下,其中有錯誤和不足的地方,還請大家糾正補充。

1.只要能滿足你的需求,應儘可能使用更小的資料型別:例如使用MEDIUMINT代替INT

2.儘量把所有的列設定為NOT NULL,如果你要儲存NULL,手動去設定它,而不是把它設為預設值

3.儘量少用VARCHAR、TEXT、BLOB型別

4.對查詢進行優化,應儘量避免全表掃描,首先應考慮在where及order by涉及的列上建立索引

5.應該儘量避免在where子句中使用!=或者<>操作符,否則將導致引擎放棄使用索引而使用全表掃描

6.應該儘量避免在where子句中對欄位進行null值判斷,否則將導致引擎放棄使用索引而是用全表掃描,
如:

select id from t where num is null 

可以在num上設定預設值0,確保表中num列沒有null值,然後這樣查詢:

select id from t where num = 0

7.應儘量避免在where子句中使用or來連線條件,否則將導致引擎廢棄使用索引進而進行全表掃描,如:

select id from t where num=10 or num=20

可以這樣查詢:

select id from t where num=10

union all

select id from t where num=20

8.下面的查詢也將導致全表掃描:

select id from where name like ‘%abc%’

若要提高效率,可以考慮全文檢索

9.in 和 not in 也要慎用,否則也會導致全表掃描,如:

select id from t where num in1,2,3

對於連續的數值,能用between就不要用in了:

select id from t where num between 1 and 3

10.應該避免在where子句中對欄位進行表示式操作,這將導致引擎放棄使用索引進行進行全表掃描。如

select id from t where num/2 = 100

應改為

select id from where num = 100*2 
  1. 應儘量避免在where子句中對欄位進行函式操作,這將導致引擎放棄使用索引而進行全表掃描。如:
select id from t where substring(name,1,3)='abc'--name以abc開頭的id 
select id from t where datediff(day,createdate,'2005-11-30')=0--'2005-11-30'

生成的id 應改為:

select id from t where name like 'abc%' 
select id from t where createdate>='2005-11-30' and createdate<'2005-
12-1' 

13.不要在 where 子句中的“=”左邊進行函式、算術運算或其他表示式運算,否則系統將可能無法正確使用索引。

14.很多時候用 exists 代替 in 是一個好的選擇:

select num from a where num in(select num from b) 

用下面的語句替換:

select num from a where exists(select 1 from b where num=a.num)  

15.並不是所有索引對查詢都有效,SQL是根據表中資料來進行查詢優化的,當索引列有大量資料重複時,SQL查詢可能不會去利用索引,如一表中有欄位sex,male、female幾乎各一半,那麼即使在sex上建了索引也對查詢效率起不了作用。

16.索引並不是越多越好,索引固然可以提高相應的 select 的效率,但同時也降低了 insert 及 update 的效率,因為 insert 或 update 時有可能會重建索引,所以怎樣建索引需要慎重考慮,視具體情況而定。一個表的索引數最好不要超過6個,若太多則應考慮一些不常使用到的列上建的索引是否有必要。

17.應儘可能的避免更新 clustered(聚合) 索引資料列,因為 clustered 索引資料列的順序就是表記錄的物理儲存順序,一旦該列值改變將導致整個表記錄的順序的調整,會耗費相當大的資源。若應用系統需要頻繁更新 clustered 索引資料列,那麼需要考慮是否應將該索引建為 clustered 索引。

18.儘量使用數字型欄位,若只含數值資訊的欄位儘量不要設計為字元型,這會降低查詢和連線的效能,並會增加儲存開銷。這是因為引擎在處理查詢和連線時會逐個比較字串中每一個字元,而對於數字型而言只需要比較一次就夠了。

19.儘可能的使用 varchar/nvarchar 代替 char/nchar ,因為首先變長欄位儲存空間小,可以節省儲存空間,其次對於查詢來說,在一個相對較小的欄位內搜尋效率顯然要高些。

20.任何地方都不要使用 select * from t ,用具體的欄位列表代替“*”,不要返回用不到的任何欄位。

21.儘量避免向客戶端返回大資料量,若資料量過大,應該考慮相應需求是否合理。

22.儘量避免大事務操作,提高系統併發能力。

相關推薦

SQL使用-----SQL優化總結

網上關於SQL優化的教程很多,但是比較雜亂。近日有空整理了一下,寫出來跟大家分享一下,其中有錯誤和不足的地方,還請大家糾正補充。 1.只要能滿足你的需求,應儘可能使用更小的資料型別:例如使用MEDIUMINT代替INT 2.儘量把所有的列設定為NOT

【MySql】Sql優化——效能優化

一、前言       當資料庫資料達到一定數量的時候,結合資料庫連線池Druid的視覺化監控介面,對系統中執行的sql語句進行檢測,對使用頻繁、執行時間長的sql語句進行優化。 二、優化方案原則 [原則一:選擇需要優化的SQL] 1,選擇需要優化

別人的滲透測試--SQL顯錯註入

XML -- 長度 upd html cnblogs http div col 續上一章。 安全狗攔下7成的人,過狗是門學問,偷笑.jpg。很感謝和https://home.cnblogs.com/u/xishaonian/ 博主能一起研究過狗。 說多了,言歸正傳SQL註入

Sql Service的藝術 SQL聚合函數的應用

包括 不同 過程 接下來 日期 p s 不可 tno 函數名 SQL提供的聚合函數有求和,最大值,最小值,平均值,計數函數等。 聚合函數及其功能: 函數名稱 函數功能 SUM() 返回選取結果集中所有值的總和 MAX() 返回選取結果集中所有值的最大值 M

MySQL數據庫基礎——SQL語言

MySQLMySQL數據庫基礎(三)——SQL語言 一、SQL語言簡介 1、SQL語言簡介 SQL是結構化查詢語言(Structured Query Language),是用於訪問和處理數據庫的標準的計算機語言。SQL語言的功能如下:A、SQL面向數據庫執行查詢B、SQL可從數據庫取回數據C、SQL可在數據庫

踩坑經歷SQL特殊排序處理

需求:2排最前面,null排最後 問題解決:IFNULL()函式 和 FIND_IN_SET()函式 select id, organization_name, organization_code,

Java程式設計師從笨鳥到菜鳥之一百零二sql注入攻擊詳解sql注入解決辦法

                在前面的部落格中,我們詳細介紹了:      我們瞭解了sql注入原理和sql注入過程,今天我們就來了解一下sql注入的解決辦法。怎麼來解決和防範sql注入,由於本人主要是搞java web開發的小程式設計師,所以這裡我只講一下有關於java web的防止辦法。其實對於其他的,

關係資料庫標準語言SQL

主要內容 資料更新 檢視 資料更新 資料操縱包括資料查詢和資料更新,資料更新又分為三類:插入、修改和刪除。 1. 插入資料 SQL的資料插入語句INSERT通常有兩種形式,一種是插入單個元組,另一種是插入子查詢結果(即元組的集合

SCCM 2012 R2部署,安裝SQL

一、安裝SCCM資料庫,同樣安裝在SCCM伺服器上,並沒有單獨一臺機器安裝。 1、下載連結: 2、在伺服器裡面開啟新增角色和功能,安裝NET Framework 3.5,並且在防火牆上放通1433埠和4022埠 3、選擇TCP 新增1433埠 4、允許連線 5、

Oracle 11g 針對SQL效能的新特性- SQL Plan Management

簡介 在Oracle 11g之前,執行計劃一直是作為“執行時”生成的物件存在。雖然oracle提供了一些方法去指導它的生成,但Oracle一直沒有試圖去儲存完整的執行計劃。 從11g開始,執行計劃就可以作為一類資源被儲存下來,允許特定SQL語句只能選擇“已知”的執行計劃。  同其他方法相比,SPM更加的靈活。

mysql高階——sql調優

小表驅動大表 使用in的sql:select * from A where id in (select id from B) 等價於: for select id from B for select * from A where

SQL語句

1:不要使用count(列名)或count(常量)來替代count(*),count(*)是SQL92定義的標準統計行數的語法,跟資料庫無關,根null和非null無關。說明:count(*)會統計值為null的行,而count(列名)不會統計此列為null的值。 2:co

spark SQL資料來源 Data Source----通用的資料 載入/儲存功能

 Spark SQL 的資料來源------通用的資料 載入/儲存功能            Spark SQL支援通過DataFrame介面在各種資料來源上進行操作。DataFrame可以使用關係變

張小白的滲透之路——SQL注入漏洞原理詳解(SQL Server)

常見資料庫注入 對於大多數的資料庫而言,SQL注入的原理基本相似,因為每個資料庫都遵循一個SQL語法標準。但是他們之間也存在包括像語法、函式等許多細微的差異。所以,在針對不同的資料庫注入時,思路、方法也不可能完全一樣。因個人的經驗所限,在接下來的例項中,只討論O

MNIST手寫數字識別應用優化

本篇的主要內容 應用三種優化方式,對之前的模型進行優化 介紹一些在程式中用到的函式 學習於《TensorFlow實戰Google深度學習框架》一書 程式 相比於第一次的簡單邏輯迴歸模型,這一次的調整了網路結構,添加了一個500個節點的隱藏層,在結構中,設定了

ElasticSearch學習總結:查詢總結

本文主要對Elasticsearch中查詢相關的知識做一個簡單的總結,內容主要包括查詢的評分機制,查詢改寫,過濾器,以及對常見的查詢做一個簡單的分類 1. 評分機制 在Lucense中預設使用TF/IDF演算法對文件進行評分,該演算法已經在前文做了簡單的介紹,這裡主要總結下什麼樣的因

MySQL 資料庫效能優化索引優化

大家都知道索引對於資料訪問的效能有非常關鍵的作用,都知道索引可以提高資料訪問效率。 為什麼索引能提高資料訪問效能?他會不會有“副作用”?是不是索引建立越多,效能就越好?到底該如何設計索引,才能最大限度的發揮其效能? 這篇文章主要是帶著上面這幾個問題來做一個簡要的分析,

android高仿系列今日頭條 --新聞閱讀器 完結 、總結

    從寫第一篇今日頭條高仿系列開始,到現在已經過去了1個多月了,其實大體都做好了,就是遲遲沒有放出來,因為我覺得,做這個東西也是有個過程的,我想把這個模仿中一步一步學習的過程,按照自己的思路寫下來,在根據碰到的知識點和問題,並且羅列出這些東西的知識點和使用方法。如果你單

sql優化--索引設計的原則

--- title: 不懂SQL優化?那你就OUT了(三) -- 索引(二) -- 索引的設計原則 date: 2018-11-03 categories: 資料庫優化 ---     上一遍部落格我們主要介紹了什麼是索引,為什麼要使用索引,索引的好處和如何建立索

MySQL效能管理及架構設計SQL查詢優化、分庫分表 - 完結篇

一、SQL查詢優化(重要) 1.1 獲取有效能問題SQL的三種方式 通過使用者反饋獲取存在效能問題的SQL; 通過慢查日誌獲取存在效能問題的SQL; 實時獲取存在效能問題的SQL; 1.1.2 慢查日誌分析工具 相關配置引數: slow