如何提高mysql查詢語句的執行速度

時間 2022-02-03 14:20:16

1樓:

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 子句中使用引數,也會導致全表掃描。因為sql只有在執行時才會解析區域性變數,但優化程式不能將訪問計劃的選擇推遲到執行時;它必須在編譯時進行選擇。

然而,如果在編譯時建立訪問計劃,變數的值還是未知的,因而無法作為索引選擇的輸入項。如下面語句將進行全表掃描:

select id from t where num=@num

可以改為強制查詢使用索引:

select id from t with(index(索引名)) where num=@num

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

select id from t where num/2=100

應改為:

select id from t where num=100*2

9.應儘量避免在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'

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

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

2樓:

在 order_code上加索引, saledate 上加索引

如何提高上百萬級記錄mysql資料庫查詢速度

3樓:愛可生雲資料庫

先安裝 apache spark,查詢資料庫的速度可以提升10倍。

在已有的 mysql 伺服器之上使用 apache spark (無需將資料匯出到 spark 或者 hadoop 平臺上),這樣至少可以提升 10 倍的查詢效能。使用多個 mysql 伺服器(複製或者 percona xtradb cluster)可以讓我們在某些查詢上得到額外的效能提升。你也可以使用 spark 的快取功能來快取整個 mysql 查詢結果表。

思路很簡單:spark 可以通過 jdbc 讀取 mysql 上的資料,也可以執行 sql 查詢,因此我們可以直接連線到 mysql 並執行查詢。那麼為什麼速度會快呢?

對一些需要執行很長時間的查詢(如報表或者bi),由於 spark 是一個大規模並行系統,因此查詢會非常的快。mysql 只能為每一個查詢分配一個 cpu 核來處理,而 spark 可以使用所有叢集節點的所有核。在下面的例子中,我們會在 spark 中執行 mysql 查詢,這個查詢速度比直接在 mysql 上執行速度要快 5 到 10 倍。

另外,spark 可以增加「叢集」級別的並行機制,在使用 mysql 複製或者 percona xtradb cluster 的情況下,spark 可以把查詢變成一組更小的查詢(有點像使用了分割槽表時可以在每個分割槽都執行一個查詢),然後在多個 percona xtradb cluster 節點的多個從伺服器上並行的執行這些小查詢。最後它會使用map/reduce 方式將每個節點返回的結果聚合在一起形成完整的結果。

如何提高sql資料庫的查詢速度

4樓:

這是一個典型問題,在網上搜一下就行了。給你搜了一個粘過來看看

1.索引優化

建索引的選擇必須結合sql查詢、修改、刪除語句的需要,一般的說法是在where裡經常出現的欄位建索引。如果在where經常是幾個欄位一起出現而且是用and連線的,那就應該建這幾個欄位一起的聯合索引,而且次序也需要考慮,一般是最常出現的放前面,重複率低的放前面。

sql server提供了一種簡化並自動維護資料庫的工具。這個稱之為資料庫維護計劃嚮導(database maintenance plan wizard ,dmpw)的工具也包括了對索引的優化。如果你執行這個嚮導,你會看到關於資料庫中關於索引的統計量,這些統計量作為日誌工作並定時更新,這樣就減輕了手工重建索引或者dbcc indexdefrag所帶來的工作量。

如果你不想自動定期重新整理索引統計量,你還可以在dmpw中選擇重新組織資料和資料頁,這將停止舊有索引並按特定的填充因子重建索引。

2.改善硬體(雙cpu,raid 5,增加記憶體)

tempdb這個臨時資料庫,它對效能的影響較大。tempdb和其他資料庫一樣可以增大,可以縮小。當資料檔案需要增長的時候,通常不能保持剩餘部分的連續性。

這時檔案就會產生碎片,這種碎片會造成效能下降。這種碎片屬於外來性碎片。要阻止在tempdb中產生外來性碎片,必須保證有足夠的硬碟空間。

一般將tempdb的容量放到平均使用容量。而你也應該允許tempdb自動增長,比如你有個一個超大的join操作,它建立了一個超過tempdb容量的時候,該查詢將失敗。你還要設定一個合理的單位增長量。

因為如果你設得太小,將會產生許多外來性碎片,反而會佔用更多資源。sqlserver調優最有效的做法之一,就是把爭奪資源的操作獨立出去。tempdb就是一個需要獨立出去的部分而tempdb和其他系統庫一樣是公用的,是存取最可能頻繁的庫,所有處理臨時表、子查詢、group by、排序、distinct、連線等等。

它最適合放到一個具有快速讀寫能力的裝置上。比如raid0卷或raid0+1捲上。

查詢語句一定要使用儲存過程;

3、查詢儘量使用top子句

4.將表按一定的約束分成子表,(如按分類)建立約束,在用like 時,先用分類 and like , 應該可能解決問題. 而且效果立稈見影!

(你要確定sql會認識你建的分割槽檢視).我一個表有上百萬的記錄(700兆),用分割槽檢視後,查詢速度基本跟10萬行一樣.

如果還是太慢,還可以考濾分散式分割槽檢視!這總可以解決問題了吧!

關鍵在於你能否把大表按某種約束分解成子表.

5樓:匿名使用者

兩個表的結構一致,包括主鍵,索引等,歷史資料和當前資料,可以按日期時間來切,

每隔一段時間,將當前資料最後的一部分搬到歷史表,然後從當前資料中刪除...一般就是這樣了.

6樓:匿名使用者

推薦你看《sql語言藝術》。

怎麼樣寫sql語句可以提高資料庫的執行速度?應該注意那些?

7樓:匿名使用者

這個範圍太大了,一下子是很難說清楚的,如果用sql server 的話,可以使用它自帶的優化器來優化,然後看看它給你的建議去優化。要注意規範化程式設計。而且要抓住一個原則來寫,就是進可能縮小查詢出來的結果集,哪怕多次查詢都沒所謂,要一步一步把大資料量縮小。

很多隻是還是得在時間中優化。set statistics time on;sql 語句set statistics time off;這個是sqlserver ,可以測出執行時間。編寫的時候要時刻想著:

縮小結果集、減少連線次數和表數。大資料量不要用update,可以用臨時表作為過度來實現update操作。

mysql查詢最近幾天的資料sql語句怎樣寫,給幾個例子

例如有一個 認證表 id 認證表主鍵 user 賬號 username 使用者名稱 logintime 認證時間 logouttime 登出時間 我想查詢最近上線的3條資料,我可以這樣寫sqlselect from 認證表 order by logintime desc limit 1,3 執行就可...

sql語句查詢mysql怎麼取前幾天的資料

一棵無所不知的小白菜 1 新建一個test資料庫,在資料庫裡建立一張data資料表。2 在表內插入5條測試資料。3 新建一個php檔案,命名為test.php。4 在test.php檔案內,使用header 方法設定檔案執行的編碼為utf8,避免輸出中文時產生亂碼。5 在test.php檔案內,使用...

MY SQL 語句寫法,SQL語句的寫法

select case when select ifnull 分組標記,from 表名 t2 where t2.編號 t1.編號 1 t1.分組標記 then else t1.分組標記 end as 標記,t1.編號,t1.名稱,t1.規格。from 表名 t1 order by t1.編號。wit...