日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Mysql删除语句优化_MySQL性能优化之常用SQL语句优化

發布時間:2025/3/19 数据库 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Mysql删除语句优化_MySQL性能优化之常用SQL语句优化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

SQL性能優化的目標:至少要達到range級別,要求是ref級別,consts最高。【阿里巴巴JAVA開發手冊】

說明:

1)、consts單表中最多只有一個匹配行(主鍵/唯一索引),在優化階段即可讀到數據。

2)、ref指的是使用普通的索引(normal index)。

3)、range 對索引進行范圍檢索

反例:explain表的結果,type=index,索引物理文件全掃描,速度非常慢,這個index級別比較range還低,與全表掃描是小巫見大巫。

最優到最差順序:system > const > eq_ref > ref > range > index > ALL

語句優化

1.簡單查詢語句優化

1.1 select 字段部分

a、返回具體的字段以代替*

1)、用不到的字段會消耗CPU和IO、消耗網絡帶寬

2)、若可以使用索引的情況下,使用*會導致回表查詢,效率更低

3)、數據暴露更不安全。

b、count(*)會統計null值的行,count(列名)不會統計null值的行

select count(user_id) from dw_user where `order` is null limit 10; 結果:5875

select count(0) from dw_user where `order` is null limit 10; 結果:5875

select count(`order`) from dw_user where `order` is null limit 10; 結果:0

5.6版本:默認會選擇輔助索引技術,沒有的話才會走主鍵聚集索引技術

1.select count(1) from employees; 使用輔助聯合索引計數

2.select count(id) from employees; 使用輔助索引技術

3.select count(name) from employees; 使用輔助索引技術

4.select count() from employees; 使用輔助索引技術

5.select count(id) from employees force index(PRIMARY) 強制使用主鍵索引

從效率角度分析:count(1) ==count()>count(name)>count(id)

因為主鍵索引的id對應的葉子節點中存放data數據,每個節點只能放16k的頁數據,所以掃描范圍不是非常廣,而且比較占內存的耗時。

count(name)統計的時候,葉子節點中存放主鍵id,每次掃描范圍更廣,效率更高。

推薦使用count(*)

在MySQL 5.7 COUNT(*)默認會選擇聚集索引技術,進行一次內部handler函數調用,即可快速獲得該表總數。

如果聚集索引較大(或者說表數據量較大),沒有完全加載到buffer pool中的話,MySQL 5.7的查詢方式有可能反而會更慢,還不如用原先的方式(MySQL 5.6)

聚集索引:就是主鍵id索引

非聚集索引:就是自定義的其他字段索引

c、函數統計,盡量放到內存中執行

select sum(a)+sum(b) as c

d、tinyint在使用時容易變為布爾型,代碼中記得轉換,用case時等于更優

case status when 0 then do1 when 1 do2 end

===》

case when status=0 then do1 when status=1 then do2 end

1.2 條件部分

a、數據類型必須一致,否則索引失效,還會增加轉換的開銷

SELECT * FROM t WHERE id = '19';

----->

SELECT * FROM t WHERE id = 19;

b、少用≥,直接使用>,可提升查詢效率

select * from dw_user where user_id>=101; ----—多一次等于的判斷

select * from dw_user where user_id>100;

1.3 分組和排序

禁止使用order by rand()

SELECT * FROM t1 WHERE 1=1 ORDER BY RAND() LIMIT 4;

---->

SELECT * FROM t1 WHERE id >= CEIL(RAND()*1000) LIMIT 4;

分組查詢時,默認分組后,還會排序,可能會降低速度

在group by 后面增加 order by null 就可以防止排序.

explain select * from emp group by deptno order by null;

1.4 索引不起效果的寫法

a、使用group by、not in、not like不使用索引

2.查詢語句-臨時表場景

2.1 必須創建臨時表的情況

如果一次性插入數據量很大,那么可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;

如果數據量不大,為了緩和系統表的資源,應先 create table,然后 insert。

2.2 臨時表的顯示刪除

先 truncate table ,然后 drop table ,這樣可以避免系統表的較長時間鎖定。

3.插入語句

//批量插入使用/*+append*/

insert into p_nbsc_ho1 select * from p_nbsc_ho (消耗時間73分鐘)

insert /*+append*/ into p_nbsc_ho2 select * from p_nbsc_ho (消耗時間7分鐘)

4.更新語句

如果只更改 1、2 個字段,不要 Update 全部字段,否則頻繁調用會引起明顯的性能消耗,同時帶來大量日志。

5.開發代碼中少用truncate table

truncate table和delete功能相同,但速度更快,使用的系統和事務日志資源較少,它無事務且不觸發trigger,容易造成事故。【阿里巴巴JAVA開發手冊】

總結

以上是生活随笔為你收集整理的Mysql删除语句优化_MySQL性能优化之常用SQL语句优化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。