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语句优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dfs遍历和bfs遍历python_广度
- 下一篇: java字符串去重复_java去除字符串