搜尋
首頁資料庫SQLsql優化常用的幾種方法是什麼?

sql最佳化常用的方法有:1、應盡量避免全表掃描,應考慮在where及order by涉及的列上建立索引;2、盡量避免在where子句中對欄位進行null值判斷;3、慎用in和not in;4、盡量避免大事務操作,提高系統並發能力。

sql優化常用的幾種方法是什麼?

一、為什麼要對SQL進行最佳化

我們開發專案上線初期,由於業務數據量相對較少,有些SQL的執行效率對程式運作效率的影響不太明顯,而開發和維運人員也無法判斷SQL對程式的運作效率有多大,故很少針對SQL進行專門的最佳化,而隨著時間的積累,業務資料量的增多,SQL的執行效率對程式的運作效率的影響逐漸增大,此時對SQL的最佳化就很有必要。

二、SQL優化的一些常用方法

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

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

select id from t where num is null

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

select id from t where num=0

3.應盡量避免在where 子句中使用!=或運算符,否則將引擎放棄使用索引而進行全表掃描。

4.應盡量避免在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

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

select id from t where num in(1,2,3)

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

select id from t where num between 1 and 3

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

select id from t where name like '%abc%'

7.應盡量避免在where 子句中對欄位進行表達式操作,這將導致引擎放棄使用索引而進行全表掃描。如:    

select id from t where num/2=100

應改為:    

select id from t where num=100*2

8.應盡量避免在where子句中對欄位進行函數操作,這將導致引擎放棄使用索引而進行全表掃描。如:    

select id from t where substring(name,1,3)='abc'--name以abc开头的id

應改為:    

select id from t where name like 'abc%'

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

10.在使用索引欄位作為條件時,如果該索引是複合索引,那麼必須使用到該索引中的第一個欄位作為條件時才能保證系統使用該索引,否則該索引將不會被使用,並且應盡可能的讓字段順序與索引順序相一致。

11.不要寫一些沒有意義的查詢,如需要產生一個空表結構:    

select col1,col2 into #t from t where 1=0

這類程式碼不會回傳任何結果集,但是會消耗系統資源的,應改成這樣:    

create table #t(...)

12.很多時候用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)

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

14.索引並不是越多越好,索引固然可以提高對應的select 的效率,但同時也降低了insert 及update 的效率,    

因為insert 或update 時有可能會重建索引,所以怎樣建索引需要慎重考慮,視具體情況而定。    

一個表的索引數最好不要超過6個,太多則應考慮一些不常使用到的列上建立的索引是否有必要。    

15.盡量使用數字型字段,若只含數值資訊的字段盡量不要設計為字元型,這會降低查詢和連接的效能,並會增加儲存開銷。    

這是因為引擎在處理查詢和連接時會逐個比較字串中每一個字符,而對於數字型而言只需要比較一次就夠了。

16.盡可能的使用varchar 代替char ,因為首先變長字段存儲空間小,可以節省存儲空間,    

其次對於查詢來說,在一個相對較小的字段內搜尋效率顯然要高些。    

17.任何地方都不要使用 select * from t ,用特定的字段列表代替“*”,不要返回用不到的任何字段。    

18.避免經常建立和刪除臨時表,以減少系統表資源的消耗。

19.臨時表並不是不可用,適當地使用它們可以使某些例程更有效,例如,當需要重複引用大型表或常用表中的某個資料集時。但是,對於一次性事件,最好使用匯出表。

20.在新建臨時表時,如果一次插入資料量很大,那麼可以使用select into 代替create table,避免造成大量log ,    

以提高速度;如果資料量不大,為了緩和系統表的資源,應先create table,然後insert。

21.如果使用到了臨時表,在預存程序的最後務必將所有的臨時表明確刪除,先 truncate table ,然後 drop table ,這樣可以避免系統表的較長時間鎖定。    

22.盡量避免使用遊標,因為遊標的效率較差,如果遊標作業的資料超過1萬行,那麼就應該考慮改寫。    

23.使用基於遊標的方法或臨時表方法之前,應先尋找基於集的解決方案來解決問題,基於集的方法通常更有效。

24.與臨時表一樣,遊標並不是無法使用。對小型資料集使用 FAST_FORWARD 遊標通常要優於其他逐行處理方法,尤其是在必須引用幾個表才能獲得所需的資料時。

在結果集中包含「總和」的例程通常比使用遊標執行的速度快。如果開發時間允許,基於遊標的方法和基於集的方法都可以嘗試一下,看看哪一種方法的效果更好。

25.盡量避免大事務操作,提高系統並發能力。

26.盡量避免向客戶端回傳大數據量,若資料量過大,應考慮相應需求是否合理。

相關推薦:《 PHP教學 》、《mysql教學

以上是sql優化常用的幾種方法是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
如何优化Discuz论坛性能?如何优化Discuz论坛性能?Mar 12, 2024 pm 06:48 PM

如何优化Discuz论坛性能?引言:Discuz是一个常用的论坛系统,但在使用过程中可能会遇到性能瓶颈问题。为了提升Discuz论坛的性能,我们可以从多个方面进行优化,包括数据库优化、缓存设置、代码调整等方面。下面将介绍如何通过具体的操作和代码示例来优化Discuz论坛的性能。一、数据库优化:索引优化:为频繁使用的查询字段建立索引,可以大幅提升查询速度。例如

如何优化SQL Server和MySQL的性能,让它们发挥最佳水平?如何优化SQL Server和MySQL的性能,让它们发挥最佳水平?Sep 11, 2023 pm 01:40 PM

如何优化SQLServer和MySQL的性能,让它们发挥最佳水平?摘要:在当今的数据库应用中,SQLServer和MySQL是两个最为常见和流行的关系型数据库管理系统(RDBMS)。随着数据量的增大和业务需求的不断变化,优化数据库性能变得尤为重要。本文将介绍一些优化SQLServer和MySQL性能的常见方法和技巧,以帮助用户利用

Linux性能调优~Linux性能调优~Feb 12, 2024 pm 03:30 PM

Linux操作系统是一个开源产品,它也是一个开源软件的实践和应用平台。在这个平台下,有无数的开源软件支撑,如apache、tomcat、mysql、php等。开源软件的最大理念是自由和开放。因此,作为一个开源平台,linux的目标是通过这些开源软件的支持,以最低廉的成本,达到应用最优的性能。谈到性能问题,主要实现的是linux操作系统和应用程序的最佳结合。一、性能问题综述系统的性能是指操作系统完成任务的有效性、稳定性和响应速度。Linux系统管理员可能经常会遇到系统不稳定、响应速度慢等问题,例如

Sybase与Oracle数据库管理系统的核心差异Sybase与Oracle数据库管理系统的核心差异Mar 08, 2024 pm 05:54 PM

Sybase与Oracle数据库管理系统的核心差异,需要具体代码示例数据库管理系统在现代信息技术领域中扮演着至关重要的角色,Sybase和Oracle作为两大知名的关系型数据库管理系统,在数据库领域中占据着重要地位。虽然它们都属于关系型数据库管理系统,但在实际应用中存在一些核心差异。本文将从多个角度对Sybase和Oracle进行比较,包括架构、语法、性能等

sql中any是什么意思sql中any是什么意思May 01, 2024 pm 11:03 PM

SQL中的ANY关键词用于检查子查询是否返回任何满足给定条件的行:语法:ANY (subquery)用法:与比较运算符一起使用,如果子查询返回任何满足条件的行,则ANY表达式评估为true优点:简化查询,提高效率,适用于处理大量数据局限性:不提供满足条件的特定行,如果子查询返回多个满足条件的行,则只返回true

MySql的SQL语句执行计划:如何优化MySQL的查询过程MySql的SQL语句执行计划:如何优化MySQL的查询过程Jun 16, 2023 am 09:15 AM

随着互联网的快速发展,数据的存储和处理也变得越来越重要。因此,关系型数据库是现代软件平台中不可或缺的组成部分。MySQL数据库已经成为最受欢迎的关系型数据库之一,因为它使用简单,易于部署和管理。然而,在处理大量数据时,MySQL数据库的性能问题经常会成为问题。在本文中,我们将深入探讨MySQL的SQL语句执行计划,介绍如何通过优化查询过程来提高MySQL数据

如何实现MySQL底层优化:SQL语句优化的常见技巧和原则如何实现MySQL底层优化:SQL语句优化的常见技巧和原则Nov 08, 2023 pm 08:19 PM

MySQL数据库作为一种常见的关系型数据库,随着数据库中数据量的增加和查询需求的变化,底层优化变得尤为重要。在进行MySQL底层优化的过程中,SQL语句优化是一项至关重要的工作。本文将讨论SQL语句优化的常见技巧和原则,并提供具体的代码示例。首先,SQL语句优化需要考虑以下几个方面:索引的优化、查询语句的优化、存储过程和触发器的优化等。在这些方面,我们将从具

在PHP开发中如何优化SQL查询操作在PHP开发中如何优化SQL查询操作Jun 25, 2023 am 11:43 AM

在PHP开发中,SQL查询操作是很常见的。然而,随着数据库中数据的不断增长,查询操作也会变得越来越耗时,这会影响系统的性能和响应速度。因此,在进行SQL查询操作时,优化是必不可少的。本文将为您介绍在PHP开发中如何优化SQL查询操作。1.避免使用"SELECT*""SELECT*"语句可以查询表中的所有列,然而这样做会使查询和返回的结果变得非常庞大,可能

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
1 個月前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器