MYSQL千萬級別數據庫查詢怎么提高查詢效率


 

 

 

一、查詢效率慢的原因

1. 沒有加索引或者索引失效

  • where條件使用如下語句會導致索引失效:null、!=、<>、or、in(非要使用,可用關鍵字exist替代)、not in、'%abc%;
  • 使用參數:num=@num、表達式操作:where num/2=100、函數操作:where substring(name,1,3)=‘abc’-name;
--exist代替in
select id from table where num exist(1,2,3,4,5,6)
--where字句使用or連接條件的替代方案
select id from table where num=10
union
select id from table where num=20;
 
--連續的數值,能用between就不要用in
select id from table where num between 1 and 3;
 
--使用參數的替代方案
--如果在where子句中使用參數(num = @num;),也會導致全表掃描。因為SQL只有在運行時才會解析局部變量,但優化程序不能將訪問計划的選擇到運行時;它必須在編譯時進行選擇。然而,如果在編譯時建立訪問計划,變量的值還是未知的,因而無法作為索引的輸入項。
select id from table where num=@num;
--替代為:強制查詢使用索引:
select id from table with(index(索引名)) where num=@num;
 
--使用表達式的替代方案
select id from table where num/2=100;
替代為
select id from table where num=100*2;
 
--使用函數操作的替代方案
select id from t where substring(name, 1, 3) = ’abc’–name; //以abc開頭
替代為
select id from t where name like ‘abc%’;//單個百分號 

 

2:查詢的數據量過大,返回不必要的行和列

只查詢有用的字段,不要用*查詢出所有字段。
采用多線程多次查詢。如果查詢條件是某段時間之類的范圍條件,可以把時間條件切分,多次查詢結果合並。

3:鎖或者死鎖

4: I/O吞吐量小,形成瓶頸效應。

5:內存不足。少造對象,對象只在需要使用時創建,不要在整個上下文傳遞。及時清理jvm內存。

6:網絡速度慢。

二、一些SQL優化方法

1:如果索引是復合索引,必須使用該索引的第一個字段作為條件才能保證系統使用該索引,否則索引不會被引用,並且應盡可能的讓字段順序與索引順序一致。

2:索引並不是越多越好,一個表索引最好不要超過6個。索引固然可以提高select效率,但是也降低了insert效率和update效率,因為insert和update會使索引重建,所以怎么建索引需要慎重考慮。

3:建表的一些優化:

盡量使用數字型字段,若數據只含有數值信息盡量不要設計成字符型,這會降低查詢和連接的性能,並會增加存儲開銷。因為引擎在處理查詢和連接時會逐個比較字符串中每個字符,而對於數字型而言只需比較一次就夠了。
盡量使用varchar/nvarchar代替char/nchar,因為首先變長字段存儲空間小,可以節省存儲空間,其次對於查詢來說,在一個相對較小的字段內搜索效率顯然要高一些。
4:任何地方都不要使用select * from table,用具體的字段列表代替*,不要返回用不到的任何字段。

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

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

原文鏈接:https://blog.csdn.net/qq_39416311/java/article/details/82315090

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM